Django-(3)
内容概览
- Django请求生命周期流程图
- 路由匹配
- 反向解析
- 路由分发
- 名称空间
- 用户管理系统代码编写逻辑
Django请求生命周期流程图
- 用户在浏览器中输入url发送请求
- django封装socket的wsgi服务器接收到请求将数据拆分发送给中间件
- 由中间件传递给路由层,分发到对应的视图层
- 调用models中表对象,通过orm拿到数据库数据
- 同时拿到templates中相应的模板进行渲染
- 然后传给中间件中,中间件再传递给wsgi服务器封装
- 发送给浏览器
路由匹配
path(‘网址后缀’,函数名)
一旦网址后缀匹配上了就会自动执行后面的函数
并结束整个路由的匹配
路由结尾的斜杠
默认情况下,不写斜杠django会做第二次处理
第一次匹配路由匹配不上,会让浏览器添加斜杠再次请求
django配置文件中可以修改是否自动添加斜杠
settings:
APPEND_SLASH = False # 默认为True
path转换器
当网址后缀不固定时,可以使用转换器来匹配
path('func/<int:id>/', views.func)
<int:id>:转换器匹配到的内容只能够是int类型,然后会当做视图函数的关键字参数传入
有多少个转换器,那么视图参数的形参个数和名字也要一一对应
def func(request, id):
pass
"""
int:IntConverter()
path:PathConverter()
slug:SlugConverter()
str:StringConverter()
uuid:UUIDConverter()
"""
re_path正则匹配
re_path(‘正则表达式’, 函数名)
只要网址后缀能够匹配上正则就会自动执行后边的函数
并结束整个路由的匹配
re_path('func/',view.func)
"""
如果直接写不加限制条件,那么无论网址的前后有什么,只要中间能够匹配上都可以执行后边的函数
eg:/aaabbbfunc/aaabbb/
所以需要加上限制条件
"""
re_path('^func/$', views.func)
正则匹配之无名分组
当网址后缀不固定的时候,就需要用到正则中的分组了
re_path('^func/(\d+)/', views.func)
正则表达式匹配到没有起名的分组会当做视图函数的位置参数传递给视图函数
正则匹配之有名分组
正则匹配也可以传递关键字参数
re_path('^func/(?P<id>\d+)/', views.func)
正则表达式匹配到有起别名的分组会当做视图参数的关键字参数传递给视图函数
django版本区别
在django1.11中,只支持正则匹配,并且方法是url ()
而django2及以上,可以使用path()、re_path();re_path()等同于url ()
反向解析
如果html页面上的路由都是直接写死固定了,一旦路由改变,那么所有的相关页面链接都会失效
反向解析:返回一个结果,此结果可以访问到对应路由
# 路由对应关系起别名
path('register/', views.register, name='reg_view')
# 使用反向解析语法
"""html页面"""
{% url 'reg_view' %}
"""后端"""
from django.shortcuts import reverse
reverse('reg_view')
# 使用反向解析,只要路由的别名不更改,那么就能访问到对应路由
有名无名反向解析
当路由中有不确定的匹配因素,那么反向解析时需要提前手动给出不确定因素指定类型与个数的具体的值
path('func/<int:id>', views.func, name='fn_id')
"""html页面"""
{% url 'fn_id' 111 %}
"""后端"""
reverse('fn_id', args=(111,))
路由分发
django中每个应用都可以有自己独立的urls.py、templates文件夹、static文件夹
能够让基于django开发的多个应用完全独立
# 项目同名文件夹下的urls.py为总路由,主要作用就是判断访问的是哪一个应用,然后分发给该应用的子路由做处理
path('app01/', include('app01.urls')) # 只要网址后缀为app01/,那么就将app01/后边的后缀分发给app01下的urls做处理
path('app02/', include('app02.urls'))
# 这是简写方式,标准写法需要先导入相应应用的urls文件,再写入include的括号中
from app02 import urls
path('app02/', include(urls))
# 子路由接收剩余的后缀,再判断是否有对应视图函数
path('func01', views.func01) # app01
path('func01', views.func01) # app02
"""当项目特别大,应用特别多的时候,可以使用路由分发,非常方便"""
名称空间
在使用路由分发的场景下,多个应用在涉及到反向解析起别名,名字冲突的时候无法正常解析
# 总路由
path('app01/', include('app01.urls'))
path('app02/', include('app02.urls'))
# app01路由
path('func/', views.func, name='fn')
# app02路由
path('func/', views.func, name='fn')
"""
此时调用fn只会是app02
有两种解决方式
"""
# 方式1:名称空间
path('app01/', include(('app01.urls', 'app01.urls'), namespace='app01')) # 创建一个名称空间,后边使用的时候需要加上名称空间使用
"""html页面"""
{% url 'app01:fn' %}
"""后端"""
reverse('app01:fn')
# 方式二:规定使别名不冲突
"""保证django项目下没有重复的别名,例如在别名前加上应用的前缀即可"""
用户管理系统代码逻辑
- 数据添加
先编写对应html文件
然后在urls.py中添加一个路由,然后到views.py中编写函数
函数中先判断当前是GET请求还是POST请求
如果是GET请求直接将数据添加界面返回出去
如果是POST请求则接收到提交数据,使用orm添加到数据库中,然后重定向返回主页面 - 数据编辑
先编写对应html文件
然后在urls.py中添加一个路由,然后到views.py中编写函数
在主页面使用GET请求携带需要编辑对象的id值
函数中先判断当前是GET请求还是POST请求
如果是GET请求将html页面返回出去
如果是POST请求则接收提交数据,使用orm修改当前用户信息到数据库中,然后重定向返回主页面 - 数据删除
在主页面使用GET请求携带需要编辑对象的id值
在urls.py中添加一个路由,然后到views.py中编写函数
使用orm通过id值直接删除数据库中用户信息
然后重定向到主页面