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,参数传递要用尖括号括起来,然后在对应的视图函数中,需要传递对应的尖括号中的参数名字。

所有类型限制如下:

  1. str:匹配任何非空字符串,但不含斜杠/,如果你没有专门指定转换器,默认使用该转换器
  2. int:匹配0和正整数,返回一个int类型
  3. slug:可理解为注释、后缀、附属等概念,是url拖在最后的一部分解释性字符。该转换器匹配任何ASCII字符以及连接符和下划线,比如building-your-1st-django-site
  4. uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号,所有字母必须小写,例如075194d3-6885-417e-a8a8-6c931e272f00。返回一个UUID对象;
  5. 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<>,尖括号中是参数名字,然后同完全匹配一样,在视图函数中要有同名的参数进行传递,这里就不用同完全匹配那样指定类型了

原文地址:https://www.cnblogs.com/alantammm/p/13921580.html