django请求生命周期流程 浏览器 发送请求(HTTP协议) web服务网关接口: 1、请求来的时候解析封装 响应走的时候打包处理; 2、django默认的wsgiref模块不能承受高并发 最大只有1000左右 上线之后会替换成uwsgi来增加并发量; 3、WSGI跟wsgiref和uwsgi的关系 WGSCI是协议; wsgiref和uwsgi是实现该协议的功能模块; Django后端: 1、django中间件: 类似于django的保安 门户 2、urls.py 路由层 识别路由匹配对应的视图函数 3、views.py 视图层 网站整体的业务逻辑 4、templates文件夹 模板层 模板语法 >>> 网站所有的html文件 5、models.py 模型层 ORM >>> 数据库
# urls.py urlpatterns = [ url(r'^login/',views.login), ]
(1)只要匹配上了就会立刻结束匹配,执行对应的视图函数; (2)url()方法的第一个参数其实是一个正则表达式,因此只要正则表达式能够从用户输入的后缀中匹配到内容就算匹配上了; # 问题引入 url(r'test',views.test), url(r'testadd',views.testadd), # 两种情况 1.正则是test >>> 接收前缀是test >>> 执行test对应的视图函数 url(r'test',views.test) >>> test >>> test函数 2.正则是test >>> 接收前缀是testadd >>> 也执行test对应的函数 url(r'test',views.test) >>> testadd >>> test函数 问:为什么两次输入的前缀不同,却匹配结果一致? 答:正则是test,两个前缀都可以匹配,因此结果一样; # django二次追加斜杠机制 url(r'test/',views.test) 正则是test/ >>> 接收前缀是test >>> 那么首次无法匹配 django还会让浏览器默认加斜杠再此发送请求 >>> test/ >>> 匹配成功 ''' 了解:斜杠机制可以取消 但是不推荐 APPEND_SLASH = False '''
情况1: url关系>>>: url(r'test',views.test) 接收前缀>>>: test666 # 在后面胡乱加内容 结果>>>: 还是能正常匹配到test函数,不合理; 解决措施>>>: url(r'test/',views.test) # 利用django二次追加斜杠机制限制限制结尾必须有/ 情况2: url关系>>>: url(r'test/',views.test) 接收前缀>>>: test/abc/edf/acd/ # 在/后面胡乱加内容 结果>>>: 还是能正常匹配到test函数,不合理; 解决措施>>>: url(r'test/$',views.test) # 利用正则限制结尾 情况3: url关系>>>: url(r'test/$',views.test) 接收前缀>>>: abcdefgtest/ # 在前面胡乱加内容 结果>>>: 还是能正常匹配到test函数,不合理; 解决措施>>>: url(r'^test/$',views.test) # 利用正则限制开头 # 总结: 合理使用正则和django二次追加斜杠机制可以限制接口前缀 # 小拓展 1.可以定制一个主页面,用户不携带后缀可以直接访问(掌握) url(r'^$',views.home) 2.也可定义一个尾页,用户输入一个没有对应关系的直接返回(了解) url(r'.*',views.error)
url(r'test/([0-9]{4}))/$',views.test) # 思考:在/后面再添加一个正则并且用括号分组会怎么样? 正常正则表达式中添加括号只不过为了可读性更强,并没有实际性含义,但是再django框架的url中却不是; 在一般情况下,路由匹配成功之后就会调用视图函数,并且自动向视图函数传递一个request位置参数 >>> test(request) (2)如果url关系中使用括号对正则进行了分组,那么在调用函数的时候,会将括号内匹配到的内容当作第二个位置参数传递给视图函数 >>> test(request, 分组的正则匹配到的内容) 这就叫无名分组;
给无名分组用正则的取别名?P<>功能进行取名,就叫做有名分组; url(r'^test/(?P<id>[0-9]{4})/$', views.test) 给括号内的正则表达式起别名之后,路由匹配成功则会调用视图函数,并将括号内匹配到的内容按照关键字参数传递给视图函数 >>> test(request, id=括号内正则匹配到的内容) # 问:无名分组和有名分组是否可以混合使用? url(r'^test/(\d+)/(?P<user_id>[0-9]{4})/$', views.test) # 无名+有名 >>> 不可以 url(r'^test/(\d+)/(\d+)/$', views.testadd) # 无名+无名 >>> 可以 url(r'^test/(?P<a>\d+)/(?P<b>\d+)',views.testadd) # 有名+无名 >>> 可以
a标签的href可以写网址的全称,也可以写后缀 href='https://www.baidu.com' # 外部地址 href='/login/' # 本地地址,自动补全当前服务的ip和port # href='127.0.0.1:8000/login/' 问:页面上有多个a标签,假如路由匹配表达式出现变化,html页面上的地址也全部失效了,怎么办?
反向解析的前提就是给url中的对应关系起一个别名,代表这一组对应关系; 然后通过反向解析可以获取到一个结果,该结果可以访问到这个路由; 步骤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:使用反向解析获取结果 '''无法明确括号内正则表达式的内容,需要人为指定括号内对应的内容,否则会报错,并且后端代码需要使用reverse模块,将无名分组使用关键字参数args=(xxx,)传入''' 前端: {% 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:使用反向解析获取结果 '''无法明确括号内正则表达式的内容,需要人为指定括号内对应的内容,否则会报错,并且后端代码需要使用reverse模块,将有名分组使用关键字参数args=(xxx,)或者kwargs={'id':1}传入都可以''' 前端: {% 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/
无名有名反向解析中多个标签的手动传值,这个值在实际工作中到底可以是什么?
一般情况下这个值可以是数据的主键值、页面的页码、区域的编号...