django——路由匹配
django——路由匹配
目录
-
django请求生命周期
-
路由匹配
1.路由匹配基础
2.反向解析
3.路由分发
4.名称空间
django请求生命周期
django请求生命周期就是从用户输入url到用户看到网页的整个过程
django请求生命周期流程图
django请求生命周期的步骤
1.用户输入网址,浏览器发起请求
2.WSGI(服务器网关接口) 创建socket服务端。接受请求
3.中间件处理请求
4.url路由,根据当前请求的url找到相应的视图函数
5.进入view,进行业务处理,执行类或者函数,返回字符串
6.再次通过中间件处理响应
7.WSGI返回响应
8.在视图层通过模板语法进行浏览器渲染
路由匹配
路由匹配的基础
对于路由匹配的理解
path('网址后缀',函数名)
一旦网址后缀匹配上了就会自动执行后面的函数 ,并结束整个路由的匹配
路由结尾的斜杠的作用
默认情况下不写斜杠 django会做二次处理(在第一次匹配不上的情况下,会让浏览器加斜杠再次请求)
-
django也可以在配置文件中指定是否自动添加斜杠
在配置文件中添加 APPEND_SLASH = False
不做操作的情况下 APPEND_SLASH默认等于Ture
path转换器
当网址后缀不固定的时候 可以使用转换器来匹配
-
path转换器的类型
path转换器 全称 匹配类型 str( ) StringConverter() 匹配除了 /
之外的非空字符串int( ) IntConverter() 匹配0或者任何正整数,返回一个int sulg( ) SlugConverter() 匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签 path( ) PathConverter() 匹配非空字段,包括路径分隔符 /
uuid( ) UUIDConverter() 匹配uuid格式的字符串 常用的path转换器是 str( )和 int( ) 转换器
拓展:uuid格式就是通用的唯一识别码的缩写,由128比特组成
-
转换器匹配
path('func/<int:year>/<str:info>/', views.func) 'func/<int:year>/<str:info>/': 网址后缀 views.func: 视图函数 def func(request,year,info): pass def func(request,*args,**kwargs): pass
网址后缀中的< int:year>/< str:info>/ 会被当成视图函数中的关键字参数传入,转换器中由多少关键字参数,视图函数中的形参必须对应,否则会因为找不到网址而报404(寻找资源不存在)的错误,也可直接获取形参 (*args, **kwargs)
re_path正则匹配
-
re_path(正则表达式,函数名)
一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数 ,并结束整个路由的匹配
re_path('^test/$', views.test) 正则中^表示以此开头,$表示,以此结尾
当网址后缀不固定的时候 可以使用转换器来匹配
-
正则匹配的无名分组
re_path('^test/(\d+)/', views.test) 匹配到的内容是text后可为任意数字,视图函数可以用任意值接收参数(位置传参)
正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数
-
正则匹配的有名分组
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test) 这里所匹配到的内容是在test页面后面的参数必须为year、others(关键字传参)
正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
django版本的区别
在django1.11中 只支持正则匹配 并且方法是 url()
django2,3,4中 path() , re_path() 并且 re_path() 等价于 url()
反向解析
使用反向解析的原因
页面上提前写死了很多路由 一旦路由发送变化会导致所有页面相关链接失效
为了防止出现该问题 我们需要使用反向解析
反向解析的理解
反向解析就是将该网页返回一个结果 该结果可以访问到对应的路由
-
路由对应关系起别名
path('register/', views.reg, name='reg_view')
后面路由不论怎么更改,都可以通过后面的别名就能找到该路由
-
使用反向解析语法
html界面
{% url 'reg_view' %}
后端
1.可以直接访问该别名所对应的路由 redirect('路由的别名') 2.reverse专门做反向解析 from django.shortcuts import reverse redirect(reverse('路由的别名'))
反向解析的操作对于三个方法[ path() 、re_path() 、url() ] 都一样操作
无名有名反向解析
当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值
path('reg/<str:info>/', views.reg, name='reg_view')
其中/<str:info>/为不确定的因素,在做反向解析时需要在html界面的反向解析语法中设置一个具体值
这个值是根据项目来任意命名,在后端同时也需要将该值进行传参
reverse('reg_view', args=('jason',))
{% url 'reg_view' 'jason' %}
路由分发
-
django 的特点
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
子路由分别在其自身的urls.py文件中设置其功能
当项目特别大 应用特别多的时候 可以使用路由分发 非常方便!!!
名称空间
有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
-
解决方式1:namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
在总路由的urls.py文件处做路由分发的地方,不单单要做数额的分发,
还要给每一个路由创建一个单独的名称空间
此时在解析时,在后端界面的reverse()中的名称会自动提示,只是名字前加了一个前缀
-
解决方式2:
创建的别名不冲突即可
既自己在名称前加上项目名的前缀
网页伪静态
网页伪静态就是将动态的网页伪装成静态的网页,从而提升网页被搜索引擎收录的概率
-
网页伪静态的表现形式
其表现形式就是网址,看着像一个具体的文件路径
-
伪静态是如何实现的
path('index.html',view.index)
在路由后面多加 .html 假装是一个静态网页
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)