本文主要是介绍Django请求生命周期与反向解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Django请求生命周期与反向解析
Django请求生命周期流程图
Django路由匹配(多版本)
1.路由
path('网址后缀',函数名(类名))
一旦网址后缀匹配上了就会自动执行后面的函数或者类,并结束整个路由的匹配
2.路由结尾的斜杠
路由结尾的斜杠我们是建议写上的,虽然Django会帮我们做二次处理即使我们不输的话Django会帮我们做二次处理帮我们自动加上这个斜杠
我们在向浏览器请求的时候如果我们没有加斜杠第一次匹配失败第二次就会自动帮你加斜杠再次发起申请
我们在Django配置文件中可以指定是否自动添加斜体,如果不想要自动添加的话那么只需要在配置文件中加一个配置即可(不过我想应该没几个人去干这种搬起石头砸自己脚的事情吧)
APPEND_SLASH = False
3.path(路由转换器)
当网址后缀不固定的时候那么就可以使用准换气来匹配
'int': IntConverter() # 匹配0或者任何正整数返回一个int
'apth': PathConverter() # 匹配非空字段,包括路径分隔符也就是/
'slug': SlugConverter() # 匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签
'str': StringConverter() # 默认类型,匹配除了/之外的非空字符串
'uuid': UUIDConverter() # 接受UUID(通用唯一识别码)字符串xxxx-xxxx-xxxxx-xxxxx
path('func/<int:number>/<str:info>/',views.func)
转换器匹配到的内容会被当做视图函数的关键字参数传入
转换器有几个叫什么名字 那么视图函数的参数必须对应否则就会以报错
def func(request,number,info):
pass
4.re_path正则匹配
re_path(正则表达式,函数名)
一旦网络后缀的正则能够匹配到内容就会自动执行后面的函数,并结束掉整个路由的匹配
re_path('^test/$', views.test)
当网址后缀不固定的时候可以使用转换器来匹配
5.正则匹配之无名分组
re_path('^test/(\d+)', views.test)
正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数
6.正则表达式之有名分组
re_path('^test/(?P<unmber>\d+)/(?P<others>.*?)', views.test)
正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
7.django版本区别
在Django1.xx版本中 只支持正则匹配,并且方法是url()
在Django2.xx版本中 path() re_path() 等价于url()
Django反向解析
页面上提前写死了很多路由,一旦路由发送变化会导致所有页面相关链接失效为了防止出现该问题,我们需要使用反向解析,反向解析:返回一个结果 该结果可以访问到对应的路由
1.路由对应关系起别名(别名不可以冲入)
path('register/',views.reg,name='regview')
2.使用反向解析语法
html页面(前端反向解析)
[% url 'reg_view' %]
后端反向解析
from django.shortcuts import reverse
reverse('reg_view')
反向解析的操作三种方法都一样path() re_path() url()
Django无名有名反向解析
1.path('reg/<str:info>', views.reg, name='reg_view')
当路由中有不确定的匹配因素,反向解析的时候需要认为给出一个具体的值
reverse('reg_view', args=('joseph',))
2.模板文件中使用
[% url 'reg_view' 'joseph' %]
Django路由分发
Django中的应用都可以有自己独立的urls.py、templates文件夹、static文件夹,这些文件能够让Django文件实现多个应用独立开发,以便小组开发使用,最终汇总到一个Django文件中通凑分配路由即可实现
1.在项目的urls.py文件内配置一级路由
1.1从对应的应用程序中导入urls文件
1.2配置path,一级路由地址+include(返回二级路由文件)
1.3非urloatterns内path配置好的路径,则默认访问静态文件
2.对应的程序app内新建urls.py,用于配置二级路由
总路由:
path('app01/', include('app01.urls'))
path('app02/', include('app02.urls'))
子路由:
path('after/', views.after) # app01
path('after/', views.after) # app02数据写死的
3.伪静态
假装自己的路径是一个静态(数据写死的)文件的路径,其实就是你经过了视图函数处理,动态渲染页面,提高百度收藏你这个页面力度,当别人搜索你这个页面相关的内容,百度就会优先展示你的页面(这样虽然能提高你页面被访问的概率,但是还是干不过RMB玩家哈哈哈)
只需要在urls.py配置路由的时候加一个.html后缀即可
Django名称空间概念
1.有路由分发场景下多个应用在设计到反向解析别名冲突的时候无法正常解析
解决方法一:
namespace(django2和版本一不太一样)
path('app01/', include(('app01.urls', 'app01' namespace='app01')))
path('app02/', include(('app02.urls', 'app02' namespace='app02')))
解决方法二:
最根源的解决方法其实就是在开展项目前就规划好别名,只要不冲突那么就不会发生错误
这篇关于Django请求生命周期与反向解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!