django请求生命周期流程图
从客户端出发,基于网络发送请求(基于HTTP协议),数据将会发送到web服务的网端接口(wsgiref)从HTTP协议里面拆分成字典
request 是被封装好的数据 (由wsgiref包装封好 需要request.的形式获取)然后wsgiref会将数据封装发送到Django中间界
——客户端请求到达路由层 路由层匹配前端获取的指令 路由层会匹配数据关系发送到视图层 视图层对数据通过逻辑判断 视图层通过逻辑判断对模型层(ORM语法拿到数据)和模板层拿到数据 视图层在拿到数据后做模板语法的整合(模型层生产相应的类(class需要提前和数据库建立链接))发送到中间界-网端接口最后打包数据发送到客户端
web服务端口
默认接收解析数据的wsgiref模块,
并发量低
工作中可以换成uwsgl支持高并发 配合nginx一起工作
路由层
路由匹配
路由层路由匹配到数据直接执行
在url中 它的r'后缀名'是一个正则表达式的形式
举个列子 在路由层的url数据网络数据中 注册界面的register路由127.0.0.1:8000/register/和127.0.0.1:8000/xxxregisterxxx/都可以访问注册界面
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/',views.login),
url(r'register',views.register)
url(r'nasregisternasn',views.register)
]
django二次追加斜杠机制
首次匹配不上 那么django还会让浏览器默认加斜杠再次发送请求
在url(r'nasregisternasn/',views.register)加个/以后
客户端无法直接通过后缀也就是路由nasregisternasn匹配不到
但是通过Django数据的二次追加/机制进入
正则首位匹配限制
正则是login/ 内容是qweqedlogin/ 那么可以匹配出文本login/
正则匹配的出的其实是里面的login而不是其他的
可以在正则的最前面加上上箭头来限制 ^ 也就是首位匹配
^login/ 也可以通过loginjlnmsl来进行首位寻找
主要用于解决客户端的乱输问题
正则末位匹配限制
用 login$/来限制末位匹配 讲究数据真实匹配的情况可以通过'^login$/来进行限制
正则重点掌握
我们在输入百度的时候并没有直接添加后缀就可以访问搜索界面得到是view.search视图
路由层接收的是没有路由后缀的我们可以展示为
url(r'^$',view.search)无后缀的127.0.0.1:8000直接进入
用户输入无相关的路由后缀的话
url(r'.*',views.error)
无名有名分组
无名分组
url(r'^res/([0-9]{4})/$', views.home)
也就是说需要在在数字0-9之间 4位的路由就可以访问到视图
127.0.0.1/1234/和127.0.0.1/1001/是一样的内容
此栏视图函数需要接收一个路由后缀 如果不接收会报一个reder()....was given 提示少一个参数接收
需要在原来的视图函数去接收:
def res(request,add)
这个add会接收到正则表达式接收到的内容
add:1234 add:1001
res(request,add)称为分组
上述特性在Django成为分组
有名分组
url(r'^res/(?P<user_id>[0-9]{4})$',view.home)
我们在视图函数层
def res(request,user_id)
在起别名之后 我们在127.0.0.1:8000/res/1234/访问是一个界面 提示我们缺少一参数user_id
添加参数后发现这个user_id和无名函数的add一样接收了路由后缀1234
res(request,user_id)中user_id接收了括号内正则表达式匹配到的内容
# 两者是否可以混合使用
url(r'^test/(\d+)/(?P<user_id>[0-9]{4})/$', views.testadd) # 不可以
无名有名分组不能混合使用!!! 单个可以重复使用
url(r'^test/(\d+)/(\d+)/$', views.testadd) # 可以
url(r'^test/(?P<a>\d+)/(?P<b>\d+)',views.testadd) # 可以
反向解析
我们在利用前端的网页跳转格式 也就是<a herf="网址"><a>进行网页跳转 首先在视图层做一个主网页
里面不必添加过多的元素 视图层在添加网页里面添加static文件的音乐地址 都是跳转就可以 在static文件里面添加相关的调用的音乐文件 将视图层的函数对应关系写入路由层配置好相关文件即可
a标签的href可以写网址的全称 也可以写后缀
href='https://www.baidu.com'
href='/login/' # 自动补全当前服务的ip和port端口
href='127.0.0.1:8000/login/'
1.页面上有很多a标签链接了其他路由
2.路由匹配表达式出现了变化 html页面上的地址全部失效
# 反向解析
通过反向解析可以获取到一个结果 该结果可以访问到一个路由
步骤1:给对应关系起别名
url(r'^func666/',views.func,name='func_view')
步骤2:使用反向解析获取结果
前端:
{% url 'func_view' %} # func666/ 结果可以访问路由
后端:
from django.shortcuts import reverse
reverse('func_view') # func666/ 结果可以访问路由
# 无名分组反向解析
步骤1:给对应关系起别名
url(r'^func666/(\d+)/',views.func,name='func_view')
步骤2:使用反向解析获取结果
'''无法明确括号内正则表达式的内容 需要人为指定'''
前端:
{% url 'func_view' 123 %} # func666/123/
后端:
from django.shortcuts import reverse
reverse('func_view',args=(666,)) # func666/666/
# 有名分组反向解析
步骤1:给对应关系起别名
url(r'^func666/(?P<id>\d+)/',views.func,name='func_view')
步骤2:使用反向解析获取结果
'''无法明确括号内正则表达式的内容 需要人为指定'''
前端:
{% url 'func_view' 123 %} # func666/123/
{% url 'func_view' id=123 %} # func666/123/
后端:
from django.shortcuts import reverse
reverse('func_view',args=(666,)) # func666/666/
reverse('func_view',kwargs={'id':1}) # func666/1/
路由并发
"""
如果一个django项目特别庞大 里面有很多应用 每个应用下有很多对应关系
那么django自带的路由层里面的代码就会非常非常的多 如何优化???
根据应用的不同拆分到不同的应用中
django支持每个应用都可以有自己独立的
路由层、模板层、静态文件、视图层(默认)、模型层(默认)
上述特性能够让django在分组开发上更加的方便、快捷
所有人都可以在应用中开发完整的项目功能
最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用
"""
1.创建多个应用 并去配置文件中注册
INSTALLED_APPS = [
'app01',
'app02'
]
2.在多个应用中编写相同的路由
urlpatterns = [
url(r'^index/',views.index111)
]
urlpatterns = [
url(r'^index/',views.index)
]
3.路由分发
总路由
from django.conf.urls import url, include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
"""总路由只负责分发 不负责视图函数对应"""
上述代码还可以简写
from django.conf.urls import url, include
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
名称空间
1.不同的应用使用了相同的别名 那么反向解析是否自动识别
index_view app01/index/
index_view app02/index/
2.验证发现默认情况下是不会自动识别应用前缀的 如何解决反向解析问题
方式1:名称空间
总路由添加名称空间
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
应用反向解析自动提示
reverse('app01:index_view')
reverse('app02:index_view')
{% url 'app01:index_view' %}
{% url 'app02:index_view' %}
方式2:只需要确保反向解析的别名在整个项目中不重复即可!!!
可以在别名的前面加上应用名的前缀
url(r'^index/',views.index,name='app01_index_view')
url(r'^index/',views.index,name='app02_index_view')
"""
名称空间其实是可有可无的知识 但是在实际工作中还是有不少程序员喜欢使用
"""