【Django】第03回 生命周期、路由匹配、反向解析、名称空间
作者:互联网
目录
1. 用户数据的增删改查
详情链接:https://www.cnblogs.com/cainiaozhy/p/16647597.html
2. Django请求生命周期流程图
3. 路由匹配
3.1 path斜杠
1.path
结构:path('网址后缀',函数名)
一旦网址后缀匹配上了就会自动执行后面的函数,并结束整个路由的匹配
2.路由结尾的斜杠
1. 默认情况下不写斜杠,django会做二次出处理
第一次匹配不上,会让浏览器加斜杠再次请求
2. django配置文件中可以指定是否自动加斜杠
控制结尾是否加斜杠:APPEND_SLASH = False
3.2 path转换器
1.path转换器流程
1.当网址后缀不固定的时候 可以使用转换器来匹配
2.第一个前缀必须是func已经写死
3.第二个没有写死,可以写任何数字,如果不是数字,则会提示没有这样的后缀
4.转换器匹配到的内容会当做视图函数的关键字参数传入func(request,year=int(后缀))
5.转换器有几个叫什么名字 那么视图函数的形参必须对应,eg:def func(request,year,info):
2.path五种转换器
str: StringConverter(), 匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int: IntConverter(), 匹配正整数,包括0
slug: SlugConverter(), 匹配字母、数字、下划线以及横杠组成的字符串
uuid: UUIDConverter(), 匹配格式化的uuid,如 194d3-685-47e-a8a8-6c931e272f00
path: PathConverter(), 匹配任何非空字符串,包含了路径分隔符(/),不能用"?"
3.3 正则匹配无名分组、有名分组
1.re_path正则匹配
结构:re_path(正则表达式,函数体)
特点:一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数,并结束整个路由的匹配
限制开头结尾:re_path('^test/$', views.test)
当网址后缀不固定的时候 可以使用转换器来匹配
2.正则匹配之无名分组
re_path('^test/(\d+)/(.*?)/', views.test)
正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数
3.正则匹配之有名分组
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test)
正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
4.django版本区别
1.在django1.11中 只支持正则匹配 并且方法是 url()
2.django2,3,4中 path() re_path() 等价于 url()
4. 反向解析
4.1 反向解析语法
应用:页面上提前写死了很多路由 一旦路由发送变化会导致所有页面相关链接失效。
解决:为了防止出现该问题 我们需要使用反向解析
定义:返回一个结果 该结果可以访问到对应的路由
1.路由对应关系起别名
path('register/', views.reg, name='reg_view')
2.使用反向解析语法
html页面: {% url 'reg_view' %}
后端:from django.shortcuts import reverse
reverse('reg_view')
ps:反向解析的操作三个方法都一样path() re_path() url()
4.2 无名有名反向解析
urls.py: path('reg/<str:info>/', views.reg, name='reg_view')
当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值
views.py: reverse('reg_view', args=('jason',))
html: {% url 'reg_view' 'jason' %}
ps:反向解析的操作三个方法都一样path() re_path() url()
5. 路由分发
特点:django中的应用都可以有自己独立的,urls.py templates文件夹,static文件夹
应用:能够让基于django开发的多个应用完全独立,当项目特别大,应用特别多的时候,可以使用路由分发,非常方便,便于小组开发,
总路由:
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),
分路由:
path('after/', views.after) # app01
path('after/', views.after) # app02
6. 名称空间
有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方式1
名称空间 namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
解决方式2
别名不冲突即可
标签:03,匹配,Django,反向,path,解析,reg,路由 来源: https://www.cnblogs.com/cainiaozhy/p/16648194.html