路由系统
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于一个URL应该调用哪一段代码。
1、路由系统基本格式
urlpatterns = [
path( 要匹配的路径(可以是正则表达式), 视图函数, 参数, 别名)
]
2、参数说明
(1)正则表达式:一个正则表达式字符串
(2)视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
(3)参数:要传递给视图函数的默认参数(字典形式,可选)
(4)别名:一个可选的name参数
3、正则表达式详解
(1)在python中使用 re_path模块来写正则表达式
(2)正则表达式的开始使用“^”表示。
(3)正则表达式的结束使用“$”表示。
(4)“r” 元字符串 防止正则表达式中的转义。
简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系。使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户端http页面数据。
小实例:
1、初识正则表达式
路由文件:
视图函数:
运行结果:
from django.contrib import admin
from django.urls import path,re_path
from dj01 import views
urlpatterns = [
re_path(r'^$',views.laowang5),#匹配空路径
#什么都不写匹配空路径:http://127.0.0.1:8000
re_path(r'^laowang6/',views.laowang6),#匹配多个路径
#如果设置结尾的话只会匹配开头那么后面再写其他路径都能访问到这个laowang6的页面
#http://127.0.0.1:8000/laowang6/a/b
re_path(r'^[a-zA-Z][0-9]$',views.laowang7),#模糊匹配
#[a-zA-Z]表示匹配所有英文字母中的任意一个字母
#[0-9]匹配任意一个数字
from django.shortcuts import HttpResponse,render
def laowang5(request):
return render(request,'laowang5.html')
def laowang6(request):
return render(request,'laowang6.html')
def laowang7(request):
return render(request,'laowang7.html')
2、正则表达式分组及分组命名匹配
(1)分组匹配:
正则表达式分组匹配是通过小括号”()”来捕获URL中的值并以位置参数形式传递给视图。
from django.contrib import admin
from django.urls import path,re_path
from dj01 import views
urlpatterns = [
re_path(r'^laowang8/(\d+)/$',views.laowang8),
#分组命名匹配
#\d表示任意数字+表示数字至少出现一次
re_path(r'^laowang9/(?P<year>[0-9]{4})/$',views.laowang9),
#分组命名匹配,使用关键字传递参数
#?P命名year变量,必须大写P,{4}表示前面的数字需要出现4次
from django.shortcuts import HttpResponse,render
#分组命名匹配
def laowang8(request,num):
'''
:param request:
:param num: 接受url中传递过来的参数
:return:
'''
print(num)
print(type(num))
return render(request,'laowang8.html')
#分组命名匹配,使用关键字传递参数
def laowang9(request,year):
print(year)
return render(request,'laowang9.html')
(2)分组命名匹配:
分组命名正则表达式组的语法是(?P<变量>pattern),
其中变量是组的名称,pattern是要匹配的模式。
捕获的值作为关键字参数而不是位置参数传递给视图函数。
from django.contrib import admin
from django.urls import path,re_path
from dj01 import views
urlpatterns = [
#默认值
re_path(r'^laowang11/$',views.laowang11),
re_path(r'^laowang11/(?P<year>[0-9]{4})/$',views.laowang11),
#传递额外参数给视图函数 ,额外参数值必须是字符串
re_path(r'^laowang12/(?P<month>[0-9]{2})/$',views.laowang12,{'year':'2019'}),
#使用默认关键字传递参数
from django.shortcuts import HttpResponse,render
def laowang11(request,year='2019'):
print(year)
return render(request,'laowang11.html',{'year':year})
def laowang12(request,year,month):
print(year,month)
return render(request,'laowang12.html',{'year':year,'month':month})
laowang11的html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
老王{{ year}}
</body>
</html>
laowang12的html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
老王12--{{ year}}--{{ month }}
</body>
</html>
运行结果:
注意:视图函数接受的是内容是字符串类型。
关系图:
3、Url反向代理(别名)
使用url反向代理,解决硬编码问题。
不使用反向代理:
浏览器访问index9,返回index9页面,点击超链接访问index10页面。
from django.contrib import admin
from django.urls import path,re_path
from dj01 import views
urlpatterns = [
# url反向代理
re_path(r'^laowang13/$', views.laowang13), # 没有使用反向代理
re_path(r'^laowang141/$', views.laowang14, name='lw14'), # 使用了反向代理
]
from django.shortcuts import HttpResponse,render
def laowang13(request):
return render(request,'laowang13.html')
def laowang14(request):
return render(request,'laowang14.html')
运行结果:
第一个跳转:
第二个跳转:
关系图:
4、Url反向解析带参数: