今日内容 django路由匹配,分组,分发和反向解析

  • django请求生命周期流程图

浏览器

          发送请求(HTTP协议)

web服务网关接口:

1、请求来的时候解析封装

       响应走的时候打包处理

2、django默认的wsgiref模块不能承受高并发 最大只有1000左右

       上线之后会替换成uwsgi来增加并发量

3、WSGI跟wsgiref和uwsgi的关系:

       WGSCI是协议

       wsgiref和uwsgi是实现该协议的功能模块

Django后端:

1、django中间件:

       类似于django的保安 门户

2、urls.py 路由层

       识别路由匹配对应的视图函数

3、views.py 视图层

       网站整体的业务逻辑

4、templates文件夹 模板层

       网站所有的html文件

5、models.py 模型层

       ORM

  • 路由匹配

一.path方法函数

1 path('网址后缀',函数名)
2 一旦网址后缀匹配上了就会自动执行后面的函数并结束整个路由的匹配
3 
4 path(route,view,kwargs,name)
5 它可以接收 4 个参数,其中前两个是必填参数后两个为可选参数

1.route
route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项,然后执行该项映射的视图函数或者 include 函数分发的下级路由

2.view
view 指的是处理当前 url 请求的视图函数。当 Django 匹配到某个路由条目时,自动将封装的 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式,传递给该条目指定的视图函数。

3.kwargs
kwargs 指使用字典关键字传参的形式给关联的目标视图函数传递参数。

4.name
name 给 URL 起个别名,常用于 url 的反向解析,避免在模板中适应硬编码的方式使用嵌入 url

二.path转换器

复制代码
 1   当网址后缀不固定的时候 可以使用转换器来匹配
 2             'int': IntConverter(), #  匹配正整数,包含0;
 3           'path': PathConverter(),  # 匹配格式化的 uuid
 4           'slug': SlugConverter(),  # 匹配字母、数字以及横杠、下划线组成的字符串;
 5           'str': StringConverter(), #  匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式;
 6           'uuid': UUIDConverter(),  # 匹配格式化的 uuid
 7      path('func/<int:year>/<str:info>/', views.func)    
 8      转换器匹配到的内容会当做视图函数的关键字参数传入
 9         转换器有几个叫什么名字 那么视图函数的形参必须对应
10       def func(request,year,info):
11            pass
复制代码

三.re_path正则匹配

在django1.11中 只支持正则匹配 并且方法是 url()
django2,3,4中 path() re_path() 等价于 url()

1 re_path(正则表达式,函数名)
2    一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数 
3       并结束整个路由的匹配
4       re_path('^test/$', views.test)
5      当网址后缀不固定的时候 可以使用转换器来匹配

四 .正则匹配之无名分组

1 re_path('^test/(\d+)/', views.test)
2    正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数

五.正则匹配之有名分组

1 re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test)
2    正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
  • 反向解析

复制代码
 1 页面上提前写死了很多路由 一旦路由发送变化会导致所有页面相关链接失效
 2 为了防止出现该问题 我们需要使用反向解析
 3 """
 4 反向解析:返回一个结果 该结果可以访问到对应的路由
 5 """
 6 1.路由对应关系起别名
 7     path('register/', views.reg, name='reg_view')
 8 2.使用反向解析语法
 9     html页面
10         {% url 'reg_view' %}
11       后端
12         from django.shortcuts import reverse
13        reverse('reg_view')
14 ps:反向解析的操作三个方法都一样path() re_path() url()
复制代码
  • 无名有名反向解析

1 path('reg/<str:info>/', views.reg, name='reg_view')
2 当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值
3 reverse('reg_view', args=('jason',))
4 {% url 'reg_view' 'jason' %}
5 
6 ps:反向解析的操作三个方法都一样path() re_path() url()
  • 路由分发

复制代码
 1 django中的应用都可以有自己独立的
 2     urls.py templates文件夹 static文件夹
 3 能够让基于django开发的多个应用完全独立 便于小组开发
 4 
 5 总路由
 6      path('app01/', include('app01.urls')),
 7     path('app02/', include('app02.urls')),
 8 子路由
 9      path('after/', views.after)  # app01
10     path('after/', views.after)  # app02
11 """
12 当项目特别大 应用特别多的时候 可以使用路由分发 非常方便!!!
13 """
复制代码

 

  • 名称空间

复制代码
 1 有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
 2 解决方式1
 3     名称空间
 4         namespace
 5             path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
 6            path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
 7 解决方式2
 8     别名不冲突即可
 9 """
10 保证django项目下没有重复的别名即可
11 """
复制代码
posted @   你好你好你好丶  阅读(71)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示