django请求生命周期流程图
当客户端浏览器访问django后端时django框架中发生了哪些事情呢?
客户端请求服务端时将客户端请求的各种数据和信息进行整理。应用程序则负责具体的逻辑处理。
1.用户在浏览器输入url 发送一个get方法的request请求
2.django中封装了socket的wsgi服务器,监听端口接收request请求
3.初步封装后传入中间件,中间件处理后再传入路由分发 匹配对应视图函数
4.再将request请求传输到views中的视图函数进行业务逻辑处理
5.再调用modles中表对象,通过orm拿到数据库的数据
6.然后对templates中对应的模版进行渲染,封装模版再次传入中间件
7.中间键处理完成后再通过wsgi再进行封装处理,响应给浏览器展示
django路由层
1.路由匹配
urls.文件中:
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', user_info.views.login),
path('home/', user_info.views.home),
path('register/', user_info.views.register),
]
django2.x及以上 path 第一个参数写什么就匹配什么
django1.x第一个参数使用的是正则表达式
无论什么版本 用户访问django项目时都会自带在url后加/后缀的功能
配置文件中 写入 APPEND_SLASH = False 可以手动取消 但不建议
2.正则匹配
urls.文件中:
urlpatterns = [
path('admin/', admin.site.urls),
re_path('^$',user_info.views.home)
# 首页正则
re_path('^login/', user_info.views.login),
]
re_path后面可以直接跟正则表达式 可以用用户输入的路由中进行匹配,只要匹配到了 就会停止对其他 会立即执行对应的视图函数
django老版本中是 url() 新版本是 re_path()
3.无名分组与有名分组
urls.文件中:
urlpatterns = [
re_path('^$',user_info.views.home)
re_path('^login/', user_info.views.login),
re_path('^test/(\d+)/', user_info.views.login),
]
def login(request,test):
print(test)
# 正则匹配会将括号内匹配到的内容,当作位置参数传递给后面的视图函数
有名分组
urlpatterns = [
re_path('^$',user_info.views.home)
re_path('^login/', user_info.views.login),
re_path('^test/(?P<id>\d+)/', user_info.views.login),
]
def login(request,id):
print(id)
可以给正则命名 (?P<别名>正则表达式)
这样正则表达式匹配到的数字会被当作关键字传参 传给视图函数
无名分组和有名参数不可以混合使用
但是可以同时使用多个
urlpatterns = [
re_path('^test/(?P<id>\d+)/(?P<num>\d{4})',
user_info.views.login),
]
4.转换器
urls.文件中:
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', user_info.views.login),
path('home/<str:info>', user_info.views.home),
path('register/<int:id>', user_info.views.register),
]
<str:info> 匹配除路径分隔符外的任何字符
<int:id> 匹配任意正整数
<slug:num> 匹配任意一个由字母或数字组成的字符串
<uuid:uuid> 匹配格式化后的uuid
<path:url> 匹配完整的url
def login(request,info):
print(info)
home(实参request对象,info='转换器匹配到的数据')
register(request,id='转换器匹配到的数据')
无名反向解析
path('login/', user_info.views.login),
通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
我们要实现 url 动态获取
path('login/', user_info.views.login,name='log'),
第一步:先给路由和视图起别名
1.前端反向解析
{% url 别名%}
<a href:"{% url 'log'%}">111</a>
通过别名绑定 这样无论怎么更改 别名不变都可以实现对应视图函数
2.后端反向解析
from django.shortcuts imput render,reverse
def login(request):
reverse('别名')
就可以拿到路由的名字
有名无名分组反向解析
urls.文件中:
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', user_info.views.login),
path('home/(\d+)', user_info.views.home,nmae='xxx'),
# 无名分组的反向解析
path('^login$',user_info.views.login)
]
前端
{% url 'xxx' 123 %}
# 输入别名 然后需要传一个符合分组正则的数据
def home(request,args):
reverse('xxx',args=(123,))
# 输入别名 然后需要传一个符合分组正则的数据
return render(request,'login.html')
这个数字一般情况放的是数据的主键值 利用主键值来编辑数据
设置一个无名分组的路径 起好别名
当需要跳转这个路径的时候,可以使用
<a href="{% url 'update' user.id %}" class="btn btn-primary">编辑</a>
跳转到别名为 update 页面 并路由对应函数传参user.views.update(id)
有名分组反向解析
path('home/(?P<别名>\d+)',user.views.func,name='xxx'),
前端语法:{% url 'xxx' 123 %}
def home(request):
reverse('xxx',args=(123,))
代码说明
urlpatterns = [ path('add/', user.views.add_user),
re_path('delete/(\d+)', user.views.delete,name='delete'),
#设置一个无名分组 deletes视图函数可以接受传参(\d+) 起别名为 'delete'
re_path('update/(\d+)',user.views.update,name='update'),
re_path('^$', user.views.home,name='home'), ]
<a href="{% url 'update' user.id %}" class="btn btn-primary">编辑</a>
<a href="{% url 'delete' user.id %}" class="btn btn-danger a1">删除</a>
# 跳转到路由别名为 delete的页面 触发对应函数 传参为 user.id
{% url 'update' user.id %}
跳转到别名为 update 页面 并传参 user.views.update(id)
{% url 'xxx' 123 %}
# 输入别名 然后需要传一个符合分组正则的数据
直接通过 反向解析跳转页面并传递参数
标签:info,views,无名,分组,user,home,path,login,django
From: https://www.cnblogs.com/moongodnnn/p/16977294.html