路由系统基本格式

urlpatterns = [

    path( 要匹配的路径(可以是正则表达式), 视图函数, 参数, 别名)

]

参数说明

  1. 正则表达式:一个正则表达式字符串
  2. 视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  3. 参数:要传递给视图函数的默认参数(字典形式,可选)
  4. 别名:一个可选的name参数

正则表达式详解

在python中使用 re_path模块来写正则表达式

正则表达式的开始使用“^”表示。

正则表达式的结束使用“$”表示。

“r” 元字符串 防止正则表达式中的转义。

简单的示例:

from django.contrib import admin
导入正则,如果要使用正则匹配的话需要导入re_path 
from django.urls import path,re_path  

from day03_dj import views
urlpatterns = [
    从上向下匹配,以匹配到的第一个为准
    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>

显示结果为:

Django路由系统

 

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>

Django路由系统

传递额外参数给视图函数

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>

浏览器显示内容为:

Django路由系统

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页面如下:

Django路由系统

点击四个跳转结果依次如下:

Django路由系统

Django路由系统
Django路由系统

Django路由系统

相关文章: