002 Django 路由
01 路由分发
urls 文件中的对应关系:
def get_timer(request):
path('timer/', get_timer),
http://127.0.0.1:8000/timer
1. url地址的访问有请求头和请求方式,请求体数据
2. django接收到http请求后,获取uri的路径名成去匹配urls文件中的路径, 匹配成功后,执行映射的函数。
3.函数的返回值是响应给客户端的数据,响应数据也要有响应头和响应体,使用HttpResponse函数把数据体内容作为参数,整合成完成的响应体。

timer/ 游览器默认会自动url添加一个/
urls.py内的 Path 也要添加一个上/
7.urls导入的引用
#1 视图函数拆分到 功能应用内
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('timer/', views.get_timer),
path('', views.index),
]
# 通过把视图函数拆分到具备的app应用中,然后在把app的函数导入到当前urls的文件里,完成app的解耦的功能
#2 render返回 自动找到模板文件
在主目录下setting 文件中的为templates 默认配置了模板的目录,web目录和操作系统的文件目录要一一对应。
#3 render函数
render函数接收到的是html静态文件,使用HttpResponse函数拼接成响应数据发回客户端,
#4 返回动态文件
在视图函数内 把要显示的给用户数据做成变量,
在render函数内以字典的形式和html文件内的变量做绑定关系{{}},render函数在执行过程中,获取变量value,替换html的变量,Httpresponse封装响应数据,客户端发起一次请求,服务端执行一次函数,获取的数据不同,用户看到的数据也不同,达到动态页面的效果。
02 路由映射
urls 路由映射
uri 一对一 视图函数
多个uri 对应 一个视图函数
但是绝对不能 一个uri 对应多个函数,且只能生效第一个。
视图函数为什么不能加括号,因为django会调用函数并且传参request,request是客户端的请求数据。
wsgi文件: 封装了socket,功能是
1 解析请求数据,并且把解析的数据以requet参数的形式 传给urls
2.封装响应数据
03 分组请求
path请求的路径使用 正则匹配原则,扩展了请求业务的多样性,
匹配的数据需要传到view中的函数内,需要把数据以形参的形式传入,
参数的形式有位置参数和关键字参数,
在path中的表现形式分别是位置参数 关键字参数,函数根据参数获取数据,并返回。
无名分组
from django.urls import path ,re_path # 默认只处理path,匹配 正则的字段要导入 re_path
re_path('action/(\d{4})',app01.views.index)
# 使用正则匹配url( \d{4}) 是4个数字,匹配成功。
# 并且把url 匹配的值,以分组的形式,传参到 要执行的函数中,def index(request,year):
# 函数才能获取到形参
def index(request, year, month):
print(year,month)
return HttpResponse('2023')
urlpatterns = [
re_path("articles/(\d{4})/(\d{1,2})",index)
]
# 通过uri 的分组不同,把形参带入到函数中,达到可以查询不同的年份。
路由的正则匹配 <位置传参>
在path中如果没有正则的规则, 默认^$ 完全匹配
如果有正则,则按照正则的匹配规则出来,注意规则的闭合
访问 ttp://127.0.0.1:8000/indexs/XXX indexs确实有这个规则 path 能够匹配到路径中,但是为什么访问不到?
urlpatterns = [
# path('index/', app02.views.index),
path('indexs/', app02.views.index), # path 默认自动了^$ ,必须完全匹配
访问 ttp://127.0.0.1:8000/action/2001/xxx
re_path('action/(\d{4})',app01.views.year),
# re_path 模块 \d{4} 只有匹配4个数字就回去执行函数,
# 因为没有路径的闭合,所以不论后面的路径怎么样,还是会执行函数的
# 如果说有细分年 月 日 的路径 那么一定要对路径闭合,不然只会走年的路径
re_path('^action/(\d{4})$',app01.views.year), # 精准匹配年份
re_path('action/(\d{4})/(\d{2})',app01.views.mooth), # 这样才能正常匹配月份。
有名分组 <关键字传参>
正则匹配的传参问题, 上面的传参
re_path('action/(\d{4})/(\d{2})',app01.views.month)
# 年的传参 月的传参
def mooth(request,year,mooth):
# 接收年的形参 接收月的形参
return HttpResponse(year+ "年" + mooth +"月" + "的文章")
优化
re_path('action/(?p<year>\d{4})/(?p<month>\d{2})',app01.views.month)
# 年的传参 月的传参
def mooth(request,month,year): # 这样就不用以位置参数的顺序写参数,而是以关键字的形式写参数
# 接收年的形参 接收月的形参
return HttpResponse(year+ "年" + mooth +"月" + "的文章")
04 路由分发
全局的view,model可以根据app拆分,那么全局的urls.py 路由也是可以拆分的
通过 setting.py 的app注册,完成 app的引入路径
通过 urls.py 的include 完成app的urls的引入
#
urlpatterns = [
# 看注释 是基于类的视图
# path('index/', app02.views.index),
# path('indexs/', app02.views.index),
# path('index/',include('app01.urls')),
# 基于另外一个urls 配置文件的导入,相当于 配置一个二级域名
path('action/',include('app02.urls')),
app02.urls内,只匹配当前app内的函数路径即可
05 路由转发器 -- 自定义路由
前提是 正则匹配的规则 放到了re_path路由路径上去了,如果要修改某个规则,需要修改路径名称,需要分割出来
urlpatterns = [
re_path('^(\d{4})$',app02.views.year),
re_path('(\d{4})/(\d{2})',app02.views.mooth),
]
观察只有匹配到路径后,才会触发view的函数,写一个函数的返回值,匹配的规则在函数内,解耦开来
path(,)
浙公网安备 33010602011771号