路由系统基本格式
urlpatterns = [
path( 要匹配的路径(可以是正则表达式), 视图函数, 参数, 别名)
]
参数说明
- 正则表达式:一个正则表达式字符串
- 视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 参数:要传递给视图函数的默认参数(字典形式,可选)
- 别名:一个可选的name参数
正则表达式详解
在python中使用 re_path模块来写正则表达式
正则表达式的开始使用“^”表示。
正则表达式的结束使用“$”表示。
“r” 元字符串 防止正则表达式中的转义。
简单的示例:
from django.contrib import admin 导入正则,如果要使用正则匹配的话需要导入re_path from django.urls import path,re_path from day03_dj import viewsurlpatterns = [ 从上向下匹配,以匹配到的第一个为准 re_path(r'^wang4/$',views.wang4), #匹配wang4路径 re_path(r'^$',views.wang5), #匹配空路径,例如:http://127.0.0.1:8000/ re_path(r'^wang6',views.wang6), 不设置结尾,可以匹配多个路径,如http://127.0.0.1:8000/wang66666/,http://127.0.0.1:8000/wang6/aaa/bbb re_path(r'^[a-zA-Z][0-9]/$',views.wang7), #[a-zA-Z]匹配任意一个英文字母,[0-9]匹配任意一个数字 ]
正则表达式分组及分组命名匹配
分组匹配:正则表达式分组匹配是通过小括号”()”来捕获URL中的值并以位置参数形式传递给视图。re_path(r'^wang8/(\d+)/$',views.wang8), \d表示任意数字,+代表一个或多个,例:http://127.0.0.1:8000/wang8/33/
def wang8(request,num): """ :param request: :param num:接收url中传递过来的参数 :return: """ print('$'*50,type(num)) #接收到的为字符串类型,<class 'str'> return render(request,'wang8.html')
分组命名匹配:
分组命名正则表达式组的语法是(?P<name>pattern),
其中name是组的名称,pattern是要匹配的模式。
捕获的值作为关键字参数而不是位置参数传递给视图函数。
re_path(r'^wang9/(?P<year>[0-9]{4})/$',views.wang9),
4表示0-9之间的数字出现四次,例:http://127.0.0.1:8000/wang9/1909/,views.py传入的值与<year>对应
def wang9(request,year): print("+"*30,year) return render(request,'wang9.html')re_path(r'^wang10/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.wang10),
4表示0-9之间的数字出现四次,例:http://127.0.0.1:8000/wang10/1909/09/传入的值与<year>,<month>对应
def wang10(request,year,month): print("+"*30,year,month) return render(request,'wang10.html')
视图函数中指定默认值
re_path(r'^wang11/$', views.wang11),def wang11(request,year='2019'): #有传值的话写传入的值,否则写默认值2019 return render(request,'wang11.html',{'year':year})html页面中内容为:
<body> 王十一先生,{{ year }} </body>显示结果为:
re_path(r'^wang11/(?P<year>[0-9]{4})/$',views.wang11), def wang11(request,year='2019'): #有传值的话写传入的值,否则写默认值2019 return render(request,'wang11.html',{'year':year})html页面中内容为:<body> 王十一先生,{{ year }} </body>
传递额外参数给视图函数
re_path(r'^wang12/(?P<month>[0-9]{2})/$',views.wang12,{'year':2019}), 传递额外参数给视图函数http://127.0.0.1:8000/wang12/12/def wang12(request,month,year): return render(request,'wang12.html',{'year':year,'month':month})html页面中内容为:<body> 王十二先生,{{ year }}-->{{ month }} </body>
浏览器显示内容为:
url反向代理(别名)
re_path(r'^wang13/$',views.wang13), re_path(r'^wang141/$',views.wang14,name='w14'), re_path(r'^wang15/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.wang15,name='w15'),def wang13(request): return render(request,'wang13.html') def wang14(request): return render(request,'wang14.html') def wang15(request,year,month): print("*"*20,type(year),) return render(request,'wang15.html')wang13.html页面下内容为:
<body> 王十三先生 第一个/代表从当前主机找,不加第一个/则从wang13下找wang14 <a href="/wang14/">跳转到王十四页面</a> 反向解析是页面找到对应的urls.py中的name,然后再找到对应的正则匹配,然后再找到对应的views.对应方法,这样就算正则变化也能找到对应的views.py下的方法,name的功能是可以定位到urls.py中的某行。通过html页面找到urls.py。正向解析是通过浏览器的url找到,urls.py,如果没有对应的views方法则报错 <a href="{% url 'w14' %}">跳转到王十四页面</a> #可以为10,但是不可以为01。想要使用01的话要加引号。数值传入到views.py后是字符串类型的 <a href="{% url 'w15' 2018 10 %}">跳转到王十五页面</a> <a href="/wang15/2019/11/">跳转到王十五页面</a> </body>wang13.html页面如下:
点击四个跳转结果依次如下: