django的生命周期是从用户发送HTTP请求数据到网站响应的过程。
整个过程的流程包括:
浏览器发送HTTE请求(通过orm) MySI获取数据->wsgiref服务>视图层一>中间件->templates模板层
->路由层urls->视图层渲染->视图层views-> 中间件smodels模型层->响应内容给浏览器一>
1.首先,用户在浏览器中输入一个url,发送一个GET方法的reguest请求。
2.在django中有一个封装了socket的方法模块wsgiref,监听端口接受request请求,初步封装传送到中间件。
3.由中间件传输到路由系统中进行路由分发,匹配对应的视图函数。
4.将request请求传输到views视图西数中进行逻辑处理。
5. 调用models中表对象,通过orm操作数据库拿到数据,同时去templates中相应的模板进行渲染
6.用response响应传输到中间件,依次处理,响应给浏览器展示给用户
Django2、3用的路由匹配都是Path 完整语法path('网址后缀',函数名)
一旦网址后缀匹配上了就会自动执行后面的函数 并结束整个路由的匹配
1.路由结尾的斜杠
我们在输入网址的时候与正确网站确实一个 / 但是成功进入了?
默认情况下不写斜杠 django会做二次处理
第一次匹配不上 会让浏览器加斜杠再次请求
如果我们想如果少了则进不去django配置文件中可以指定是否自动添加斜杠(到settings文件中末尾添加)
APPEND_SLASH = False
2.path转换器
如我我们需要在网址后面再添加几个数据呢 ? http://127.0.0.1:8001/index/XXXX/XXXX/
当网址后缀不固定的时候 可以使用转换器来匹配
'int': IntConverter()
'path': PathConverter()
'slug': SlugConverter()
'str': StringConverter()
'uuid': UUIDConverter()
path('func///', views.func)
转换器匹配到的内容会当做视图函数的关键字参数传入
转换器有几个叫什么名字 那么视图函数的形参必须对应
def func(request,year,info):
pass
3.re_path正则匹配
re_path(正则表达式,函数名)
一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数 并结束整个路由的匹配
re_path('^test/$', views.test) # 两个test同时出现但是我们想运行testadd结果是test
re_path('^testadd/$', views.testadd)
当网址后缀不固定的时候 可以使用转换器来匹配
4.正则匹配之无名分组
re_path('^test/(\d+)/', views.test)
正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数
5.正则匹配之有名分组
re_path('^test/(?P\d+)/(?P.*?)/', views.test)
正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
6.django版本区别
在django1.11中 只支持正则匹配 并且方法是 url()
django2,3,4中 path() re_path() 等价于 url()
我们在页面上提前写死了很多路由 一旦路由发送变化会导致所有页面相关链接失效 为了防止出现该问题 我们需要使用反向解析
反向解析:返回一个结果 该结果可以访问对于的路由
1.路由对应关系起别名
path('register/', views.reg, name='reg_view') # urls页面起别名 无论怎么变
点击我反向解析 # html都会自动解析
第二种方法后端reverse
from django.shortcuts import reverse
def reg(request):
print(reverse('reg_view')) # 当你写入reg就回弹出对应的名称了
return render(request, 'reg.html')
ps:反向解析的操作三个方法都一样path() re_path() url()
path('reg//', views.reg, name='reg_view')
当我们路由前缀中有不确定的匹配因素 反向解析会出现报错
因为太多值它自己也不知道该给你拿一个 所以反向解析的时候需要人为给出一个具体的值
def reg(request):
print(reverse('reg_view', args=('like',)) # Urls需要人为去指定一个具体的值
return render(request, 'reg.html')
点击我反向解析 #Html页面也需要指定一个值
ps:反向解析的操作三个方法都一样path() re_path() url()
Django中的应用都是可以有自己独立的文件夹的 意思就是说每一个app可以拥有自己的(urls.py templates文件夹 static文件夹)
能够让基于Django开发的多个应用完全独立 便于小组开发
总路由
from django.urls import include
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),
子路由
path('after/', views.after) # app01
path('after/', views.after) # app02
当项目特别大 应用特别多的时候 可以使用路由分发 非常方便!!!
有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方式1
名称空间
namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
这个时候的就不单单只是路由分发 还会单独的创建一个路由名称空间 这个时候的reverse就变了app01:after_view
解决方式2
别名不冲突即可
保证django项目下没有重复的别名即可
技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请
点点赞收藏+关注
谢谢支持 !!!