django_路由匹配
path:完全匹配
存在如下demo:
#urls.py path(r'articles/<year>/<int:month>/<slug:slug>/',views.special) #views.py def special(request,year,month,slug): return HttpResponse('year:%s'%year)
如上,浏览器中输入:http://127.0.0.1:8000/articles/1d/23/xx/ 页面展示 year:1d
其中year没有指定类型,所以可以输入1d,如果month字段不是整型,则404,参数传递要用尖括号括起来,然后在对应的视图函数中,需要传递对应的尖括号中的参数名字。
所有类型限制如下:
str
:匹配任何非空字符串,但不含斜杠/
,如果你没有专门指定转换器,默认使用该转换器int
:匹配0和正整数,返回一个int类型slug
:可理解为注释、后缀、附属等概念,是url拖在最后的一部分解释性字符。该转换器匹配任何ASCII字符以及连接符和下划线,比如building-your-1st-django-site
;uuid
:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号,所有字母必须小写,例如075194d3-6885-417e-a8a8-6c931e272f00
。返回一个UUID对象;path
:匹配任何非空字符串,重点是可以包含路径分隔符’/‘。这个转换器可以帮助你匹配整个url而不是一段一段的url字符串。要区分path转换器和path()方法。
re_path url:正则匹配
django 2.0以上的版本中推荐使用url,而且url返回的就是一个re_path
from django.conf.urls import url
demo如下:
#urls.py url(r'^articles/[0-9]{4}/$', views.reg_view), url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.special), #views.py def special(request,year,month,slug): return HttpResponse('year:%s'%year) def reg_view(request): return HttpResponse('路由正则匹配成功')
第一条url中没有传递参数,直接使用正则表达式进行匹配,如果输入的满足该表达式,则对应视图中的reg_view逻辑
第二条url中传递了参数,对某一个参数需要用圆括号括起来,然后加上?P<>,尖括号中是参数名字,然后同完全匹配一样,在视图函数中要有同名的参数进行传递,这里就不用同完全匹配那样指定类型了