首页 > 其他分享 >Django之路由层

Django之路由层

时间:2022-09-01 21:47:39浏览次数:58  
标签:匹配 views 后缀 视图 Django path 路由

django请求周期生命流程图

django的生命周期是从用户发送HTTP请求数据到网站响应的过程。

整个过程的流程包括:
  浏览器发送HTTP请求 ——> wsgiref服务 ——> 中间件 ——> 路由层urls ——> 视图层views ——> models模型层 ——> (通过orm)MySQL获取数据 ——> 视图层 ——>templates模板层 ——> 视图层渲染 ——> 中间件 ——> 响应内容给浏览器
  
  
1.首先,用户在浏览器中输入一个url,发送一个GET方法的request请求。
2.在django中有一个封装了socket的方法模块wsgiref,监听端口接受request请求,初步封装传送到中间件。
3.由中间件传输到路由系统中进行路由分发,匹配对应的视图函数。
4.将request请求传输到views视图函数中进行逻辑处理。
5.调用models中表对象,通过orm操作数据库拿到数据,同时去templates中相应的模板进行渲染
6.用response响应传输到中间件,依次处理,响应给浏览器展示给用户

image

路由匹配

路由匹配的结构: path('admin/', admin.site.urls)
  path(第一个参数是网址后缀 ,第二个参数是函数名/类名)
  # 一旦网址后缀匹配上了就会自动执行后面的函数,并且结束整个路由的匹配(后面再有相同的网址后缀,也不会再匹配了)
路由结尾的斜杠
 默认情况下不写斜杠的话 django底层会做二次处理
 正常情况不加斜杠的网址请求在django底层是做了二次处理的
 第一次 会返回301 重定向
 第二次 会返回200 请求成功
 
 ps:django配置文件中可以指定是否自动添加斜杠
    APPEND_SLASH = False  # 加上这个配置不会自动添加
 不建议添加 用户体验不好

image

path转换器(只在django2.x版本以上才有)
 # 当网址后缀不固定的时候 可以使用转换器来匹配
 有五种类型:
		'int': IntConverter(),
		'path': PathConverter(),
		'slug': SlugConverter(),
		'str': StringConverter(),
		'uuid': UUIDConverter(),
匹配的格式是:path('func/<int:year>/<str:info>/', views.func) # 后缀想加什么类型的和数量可以直接写上去
 '''
 转换器匹配到的内容会当作视图的关键字参数传入,转换器写入几个,写入的名字,必须和视图函数的参  数一一对应
 '''
 def func(request,year,info):
     pass
re_path正则匹配(z很重要!)
re_path的结构: re_path(正则表达式,函数名)
特点是:后缀只要有正则表达式符合的文本,那么就算匹配成功,不管后缀后面有多少内容!
可以在后缀后面加上斜杠(也可以区分跟路由匹配的结果)
re_path('^test/$', views.test)
为了提高匹配的精准度 可以在正则表达式里开头加^结尾加上$,这样匹配的文本就必须和输入的保持一致 
当网址后缀不固定的时候可以使用转换器来匹配
正则匹配之无名分组
正则匹配如果网址后缀不固定的时候,想要匹配的更多个
	re_path('^test/(\d+)/(.*?)', views.test)
第一个网址后缀只能是test,第二个后缀是可以匹配任意数字,第三个后缀是可以匹配任意类型任意数量
'''正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数'''

正则匹配之有名分组
 re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test)
 就是给正则表达式起别名的方式。
 正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数
 此时的函数参数就需要和转换器的一样了!写什么名字传什么参数
django匹配版本区别
在django1.11中 只支持正则匹配 并且方法是 url()
django2,3,4中  path()  re_path() 等价于 url()

反向解析

'''反向解析应用的场景:页面上写了很多固定的路由,一旦路由发生改变,那么所有相关页面的链接都会失效
为了防止这个问题,我们需要使用反向解析
'''
# 反向解析会返回一个结果,该结果可以访问到对应的路由
1.路由对应关系起别名
 path('index/',views.index,name='ind_view')
2.使用反向解析语法(reverse)
 html页面:
         {% url 'ind_view' %}
 后端:
    三板斧的模块:from django.shortcuts import reverse
    reverse('ind_view')

# 反向解析的操作适用于三个中路由匹配方式
 path(),re_path() ,url()
 

有名无名反向解析

'''当路由中有不确定的匹配因素,那么反向解析的时候需要人为的给出一个值'''
 path('index/<str:info>/',views.index,name='ind_view')
 reverse('ind_view',arg=('summer',))
 {% url 'ind_view','summer'%}
 
# 反向解析的操作适用于三个中路由匹配方式
 path(),re_path() ,url()
 

路由分发(关键字include)

'''django中的应用都有自己独立的文件夹
   urls.py  views.py  templates.py  models.py
   能够让基于django开发的当多个应用完全独立 便于小组开发
'''
总路由:path('app01/',include('app01.urls'))
       path('app01/',include('app01.urls'))
	   
子路由:path('func/',views.func)  #app01
       path('func/',views.func)  #app02
ps:使用场景:当项目特别大的时候,应用特别多的时候,使用路由分发,非常方便

名称空间

'''主要应用于路由分发下的多个应用涉及到反向解析时候的别名冲突无法解析的问题'''
解决方法1:
      namespace
        	path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
           path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
		   
解决方法2:
       把应用名当作别名的前缀,这样就无法冲突(需要保证django项目下没有重复的名字)

标签:匹配,views,后缀,视图,Django,path,路由
From: https://www.cnblogs.com/Hsummer/p/16647903.html

相关文章

  • django3/路由层小知识
    Django请求声明周期流程图路由匹配反向解析无名有名反向解析路由分发名称空间django请求生命周期流程图浏览器默认基于HTTP协议访问web服务网关接口(WebServerGa......
  • Django请求生命周期与反向解析
    Django请求生命周期与反向解析Django请求生命周期流程图Django路由匹配(多版本)1.路由 path('网址后缀',函数名(类名)) 一旦网址后缀匹配上了就会自动执行后面的函数......
  • 路由匹配与解析
    django请求生命周期路由匹配1.路由path('网址后缀',函数名)一旦网址的后缀匹配上时,就会自动执行后面的函数并结束整个路由的匹配2.路由结尾的斜杠2.1如果输入网址......
  • 路由匹配
    Django请求生命周期流程图<style="zoom:50%;"/>路由匹配path('网址后缀',函数名) 一旦网址后缀匹配上了就会自动执行后面的函数并结束整个路由的匹配1.路由结......
  • vue——路由使用
    一.什么是路由:1.理解:一个路由(route)就是一组映射关系(key-value),多个路由需要路由器(router)进行管理。2.前端路由:key是路径,value是组件。二.基本使用:1.安装vue-router,命......
  • Django国际化
    安装python环境并配置系统变量安装django:pipinstallDjangoCMD中输入django-admin 看看是否有命令提示输出,如果没有,将”xxxxx\Roaming\Python\Python39\Scripts”加......
  • django框架03
    目录静态文件操作静态文件资源及配置form表单注意事项request对象方法pycharm连接MySQLdjango连接MySQLdjangoORMORM操作MySQL操作数据的增删改查操作外键创建静态文件操......
  • 轻量级消息队列 Django-Q 轻度体验
    前言最近做的这个项目(基于Django),需要做个功能,实现定时采集车辆定位。这让我想起来几年前那个OneCat项目,当时我用的是Celery这个很重的组件Celery实在是太重了,后来我做公......
  • django框架-2
    目录静态文件及相关配置请求方法request对象方法pycharm连接mysqldjango连接MySQLdjango与ormorm语法orm外键关联8.31小练习静态文件及相关配置1.先编写一个登录功能 1.......
  • 【Django】连接MySQL与orm语法
    目录1.流程图2.静态文件及相关配置3.请求方法4.request对象方法5.链接数据库5.1pycharm连接MySQL5.2django链接MySQL6.Djangoorm7.orm语法7.1orm增删改查7.2or......