导读:本篇文章首席CTO笔记来给大家介绍有关django2如何定义url的相关内容,希望对大家有所帮助,一起来看看吧。
请教各位高手Django的url配置问题
流线型化(streamlinling)函数导入
1:直接导入视图函数
from django.conf.urls.defaults import *
from mysite.views import hello
urlpatterns = patterns('',
(r'^hello/$', hello),
(r'^time/$', time),
)
2:导入包函模块名和函数的客串,而不是函数本身
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^hello/$', 'views.hello'),
(r'^time/$', 'views.time'),
)
3:不用导入任何视图内容,写清楚字符串描述
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^hello/$', 'mysite.views.hello'),
(r'^time/$', 'mysite.views.time'),
)
4:提取一个公共视图前缀
from django.conf.urls.defaults import *
urlpatterns = patterns('mysite.views',
(r'^hello/$', 'hello'),
(r'^time/$', 'time'),
)
5:partterns()返回对对象的相加
旧:
from django.conf.urls.defaults import *
urlpatterns = patterns('mysite.view',
(r'^hello/$', 'hello'),
(r'^time/$', 'time'),
(r'^other/$', 'mysite.others.other'),
)
新:
from django.conf.urls.defaults import *
urlpatterns = patterns('mysite.view',
(r'^hello/$', 'hello'),
(r'^time/$', 'time'),
)
urlpatterns += patterns('mysite.others',
(r'^other/$', 'other'),
)
6:到目前为止,在所有URLconf例子中,我们使用的很简单,即“无命名”正则表达式组,在我们
想要捕获的URL部分加上小括号,django会将捕获的文本作为位置参数传递给视图函数。在更
高级的用法中,还可以使用“命名”正则表达式组来捕获URL,并且将其作为“关键字”参数 传给视图。
在python正则表达式中,命名的正则表达式组的语法是(?pnamepattern),这里name是组的名字,而pattern是匹配的某个模式。
下面是一个使用无名组的URLconf的例子:
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^arcticles/(\d{4})/$',views.year_archive),
(r'^arcticles/(\d{4})/(\d{2})/$', view.moth_archive),
)
下面是相同的URLconf,使用命名组进行了重写:
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^arcticles/(?Pyear\d{4})/$', veiws.year_archive),
(r'^arcticles/(?Pyear\d{4})/(?Pmonth\d{2})/$', veiws.month_archive),
)
如果不带命名组,请求/arcticle/2006/03/将会等于这样的函数调用:
month_archive(request, '2006', '03')
而带命名组,同样的请求就是这样的函数调用:
month_archive(request, year='2006', month='03')
从中可以看出,使用命名组可以让你的URLconf更加清晰,减少参数次序可能搞混潜在的Bug,
还可以让你的定义中对参数重新排序。
7:视图冗余:
# urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^(foo)/$', views.foobar_view),
(r'^(bar)/$', views.foobar_view),
)
# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foobar_view(request, url):
m_list = MyModel.objects.filter(is_new=True)
if url == 'foo':
template_name = 'template1.html'
elif url == 'bar':
template_name = 'template2.html'
return render_to_response(template_name, {'m_list': m_list})
利用上面的方法可以减少视图冗余
8:为url里传入固定的参数:
# urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
(r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)
# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foobar_view(request, template_name):
m_list = MyModel.objects.filter(is_new=True)
return render_to_response(template_name, {'m_list': m_list})
一些URL参数详解:
/mydata/jan/01/
/mydata/jan/02/
/mydata/jan/03/
以上为三个url我们可以用不同的方式实现
1: (r'^mydata/(/w{3})/(/d/d)', views.mydata) mydata(request, 'jan', '01')
2: (r'^mydata/(?Pmonth/w{3})/(?Pday/d/d)', view.mydata) mydata(request, month='jan', day='01')
3: (r'^mydata/birthday/$', views.mydata, {month:'jan', day:'01'}) mydata(request, month='jan', day='01')
9:include导入:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^weblog/', include('mysite.blog.urls')),
(r'^photos/', include('mysite.photos.urls')),
(r'^about/$', 'mysite.views.about'),
)
10:实例:
验证用户是否登录:
以下是三个视图
def my_view1(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template1.html')
def my_view2(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template2.html')
def my_view3(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template3.html')
以下是对视图进行包装:
def requires_login(view):
def new_view(request, *args, **kwargs):
if not request.user.is_authenticated(): #如果用户没有登录,跳转到登录界面
return HttpResponseRedirect('/accounts/login/')
return view(request, *args, **kwargs) #否则返回传进来的方法
return new_view #返回new_view值:登录视图或者是传进来的视图
以下为URL配置:
from django.conf.urls.defaults import *
from mysite.views import requires_login, my_view1, my_view2, my_view3
urlpatterns = patterns('',
(r'^view1/$', requires_login(my_view1)),
(r'^view2/$', requires_login(my_view2)),
(r'^view3/$', requires_login(my_view3)),
)
Django 给 css 图片加 url
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title景安/title
/head
body
a href="ssl.zzidc.com"img src="images/a.jpg"/a
/body
/html
在a标签里面嵌套一个img标签即可给图片添加链接
Django媒体文件URL的配置
在Django中经常需要配置图片、视频等表态文件,在配置时较为复杂,这里纪录一下:
在文件尾部加入以下目录,用于存放上传的文件
在models中写上image字段其中 %Y 代表年, %m 代表月, blank=True 代表可以为空。当上传文件时,代表上传到image目录下,以当前年月子目录的文件夹中。
image = models.ImageField(upload_to="image/%Y/%m", blank=True)
其中src中的{{ MEDIA_URL }}会在模板中渲染为第一步中的 /media/
如果您想在模板中使用{{MEDIA_URL}},请在“模板”的“context_processors”选项中添加 django.template.context_processors.media 。
通过以上步骤,基本上可以在前端正常渲染出结果了,但还需要给图片添加一个URL以正常显示。
第一行为引入静态文件的serve,第二行为导入工程配置文件中的 MEDIA_ROOT
在url中加入:
Django中url与path及re_path区别
初学者 一般不能分清两者的区别,所这简单介绍下两者.首先,url是Django 1.x中的写法,p在Django2.1中,开始舍弃django1.x中的url写法。在django2.x中,描写url配置的有两个函数path和re_path.re_path()函数可以看做是django 1.x中得url函数,即可以在路径中使用正则.
path与url是两个不同的模块,效果都是响应返回页面, path调用的是python第三方模块或框架,而url则是自定义的模块,如Views下的def函数对应你url中的参数值.
例如:
在settings.py文件中有一个ROOT_URLCONF设置,设置的是在访问网址时通过哪一个url文件去匹配所请求的网址
url或者re_path要复杂一些 (r’^blog/(?P[0-9]{4})/′)首先需要开始符和结尾符 ') 首先需要开始符^和结尾符 ′)首先需要开始符和结尾符,参数匹配一个 ()就是一个匹配参数,
(?P匹配的字段名正则表达式)
进行匹配是不包括get或者post请求方式的参数及域名比如 并不会匹配?后边的字符
可以给request参数设置一个默认值,最常见的分页url,比如
自定义错误页面关键字handler400=blog.views.page_no_find
参数的使用方法path(‘blog/str:string/’) 简单了很多,就是尖括号,前边是str代表参数的类型,后面代表参数的名称
捕获url中的参数需要用到尖括号 指定尖括号中的值类型比如int:astr:link这个转换器还有许多类型比如:
如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。
举例:传递 数字结尾的参数
在python3中使用django2的时候,在设置urls的时候,会遇到一些坑。这里做一下记录。
系统的urls.py里,在1.X的时候,都是采用的url方式。如下
在2.0中,它推荐使用的是path模块,所以这里就改写一下。引包
注意:
1.x里面的写法是
现在的写法
这样一对比就能明白了吧,使用的链接是 ;key=abc
1.x中写法
可是在2.0中你这么写,会报错,说什么app_name的,这个自己可以看一下,怎么解决呢,其实很简单,只要在自己项目urls.py中加上这句就行了.如果不加的话可能报错,
注:
Django中关于URL配置文件urls.py的理解
1. 什么是urls.py
2. urls.py文件位置
3. urls.py配置格式
urlpatterns = patterns('视图前缀',
url(r'^正则表达式1/$', '视图函数1', name="url标识1"),
url(r'^正则表达式2/$', '视图函数2', name="url标识2"),
)
4. urls.py如何工作
django怎么发起url请求
开始于setting文件。当你运行python manage.py runserver,脚本将在于manage.py同一个目录下查找名为setting.py的文件。这个文件包含了所有有关这个Django项目的配置信息,均大写: TEMPLATE_DIRS , DATABASE_NAME , 等. 最重要的设置时ROOT_URLCONF,它将作为URLconf告诉Django在这个站点中那些Python的模块将被用到
当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。 当找到这个匹配 的URLpatterns就调用相关联的view函数,并把HttpRequest 对象作为第一个参数。
正如我们在第一个视图例子里面看到的,一个视图功能必须返回一个HttpResponse。 一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response
总结一下:
进来的请求转入/hello/.
Django通过在setting.py中的ROOT_URLCONF配置来决定根URLconf.
Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
如果找到匹配,将调用相应的视图函数
视图函数返回一个HttpResponse
Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
结语:以上就是首席CTO笔记为大家介绍的关于django2如何定义url的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。