发布时间:2018-06-18 16:05:54编辑:admin阅读(5050)
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
语法:
urlpatterns = [ path(正则表达式, views视图函数,参数,别名), ]
参数说明:
一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数
无命令分组
举例:
修改mysite目录下的urls.py,最后一行添加
urlpatterns = [ path('admin/', admin.site.urls), path('userInfo/', views.userInfo), #完全匹配,必须是articles/2003/,后面加其他的,也会报404 path('articles/2003/', views.special_case_2003), ]
修改blog目录下的views.py,添加函数special_case_2003
def year_archive(req,year): #在Django1.x里,我们需要对year做类型转换: #year = int(year) #在2.0里面,不需要转换year return HttpResponse(year)
访问url
http://127.0.0.1:8000/articles/2003/
页面输出:2003
如果访问以下链接
http://127.0.0.1:8000/articles/2003/01
页面提示404,因为它是完全匹配
Page not found (404)
有命令分组(推荐)
上面匹配年份的,可以改写成这样:
如果需要匹配年份,年份是4位数据,需要使用正则匹配,那么需要导入re_path模块,代码如下:
from django.contrib import admin from django.urls import path,re_path from blog import views urlpatterns = [ path('admin/', admin.site.urls), path('userInfo/', views.userInfo), #正则匹配4位整数 re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),
访问url
http://127.0.0.1:8000/articles/2004/
页面输出:2004
访问2008,同样也可以输出2008
在Django2.0其中一个新特性为:简化Url路由的语法。
上面的url,可以使用Django2.0新语法
path('articles/<int:year>/', views.year_archive),
它支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数
并且会自动转换year为整型而不是字符串。
URL参数捕获
在新的语法里,url字符串有以下规则:
1.在url里使用尖括号“<>”来捕获值
2.尖括号捕获值的格式<converter:name>。其中converter为路径转换器,name为参数名,如<int:year>。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。
3.url不需要以斜杠开头。
代码示例:
urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]
views.py相关函数如下:
def special_case_2003(request): return HttpResponse('2003') def year_archive(request,year): return HttpResponse(year) def month_archive(request,year,month): return HttpResponse('{}/{}'.format(year,month)) def article_detail(request,year,month,slug): return HttpResponse('{}/{}/{}'.format(year,month,slug))
匹配示例:
/articles/2005/03/:匹配到第3个规则,调用views.month_archive(request, year=2005, month=3)
/articles/2003/:匹配到第1个规则,调用views.special_case_2003(request)
/articles/2003/as:没有匹配到规则,原因是所有的规则都是以斜杠结尾
/articles/2003/03/building-a-django-site/:匹配到第4个规则,调用views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)
分别访问页面:
http://127.0.0.1:8000/articles/2005/03/
页面输出:2005/3
http://127.0.0.1:8000/articles/2003/
页面输出:2003
http://127.0.0.1:8000/articles/2003/as
页面输出:Page not found (404)
http://127.0.0.1:8000/articles/2003/03/building-a-django-site/
页面输出:2003/3/building-a-django-site
Path Converter
url里捕获的值使用Path Converter来对值做转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。
默认Path converter
Django2.0自带的PathConveter包括:
str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器。
int:匹配0及正整数。
slug:匹配字母、数字以及横杠、下划线组成的字符串。
uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path:匹配任何非空字符串,包含了路径分隔符(/)
注册自定义Path Converter
当默认的Path Converter不能满足需求时,Django2.0支持用户注册自定义的Path Converter。
Path Converter是一个类,定义Converter类需要包含下面的属性或方法:
regex属性,字符串类型
to_python(self, value) 方法,它处理将匹配的字符串转换为应该传递给view函数的类型。 如果它不能转换给定的值,它应该抛出ValueError。
to_url(self, value) 方法,和 to_python 相反,它会将Python类型转换为在URL中使用的字符串。
示例:
定义Path Converter
新建一个converters.py文件,与urls.py在同一目录下,写一个类,内容如下:
class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value
写完类后,使用register_converter()注册Converter到url配置里,并使用它。如下所示,注册了一个yyyy:
修改urls.py,内容如下:
from django.contrib import admin #增加register_converter方法 from django.urls import path,re_path,register_converter from blog import views #导入converters模块 from . import converters #使用register_converter()注册Converter到url配置里,并使用它,注册了一个yyyy register_converter(converters.FourDigitYearConverter, 'yyyy') urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<yyyy:year>/', views.year_archive), ]
访问链接
http://127.0.0.1:8000/articles/2003/
匹配第一条规则,页面输出2003
http://127.0.0.1:8000/articles/2018/
匹配第二条规则,页面输出2018
上一篇: diango引入静态文件
下一篇: diango路由分发
47742
46232
37105
34624
29226
25881
24741
19860
19413
17904
5712°
6311°
5830°
5884°
6980°
5826°
5841°
6357°
6312°
7669°