[oldboy-django][2深入django]django一个请求的生命周期 + WSGI + 中间件
1 WSGI
# WSGI(是一套协议,很多东西比如wsgiref, uwsgiref遵循这一套协议)
- django系统本质
别人的socket(wsgiref或者uwsgiref) + django - 简单定义
WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,
实现web app与web server间的解耦。 - 更完整的web请求生命周期
request --> 遵循wsgi的socket服务器(wsgiref)--->django的中间件--->路由系统--->视图函数
视图函数--->路由系统--->中间件--->wsgi--->客户端 - django借用的wsgiref服务器的样例
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
"""
@params: environ 请求的相关信息
@params: start_response容器,将里面的内容作为消息头返回给用户
@return 返回的内容作为消息体返回给用户
"""
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__':
httpd = make_server('', 8000, RunServer)
httpd.serve_forever()
# 等待客服端的socket请求,当请求过来时,执行RunServer函数 - 一个简单的socket服务器
import socket
def handle_request(client):
buf = client.recv(1024)
client.send("HTTP/1.1 200 OK\r\n\r\n")
client.send("Hello, Seven") def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost',8000))
sock.listen(5)
while True:
connection, address = sock.accept()
handle_request(connection)
connection.close() if __name__ == '__main__':
main()
2 django一个请求的完整生命周期
- django一个请求的生命周期
简单来说就是: wsgi 和django 客户端-->request--->wsgi--->所有中间件(middleware的process_request)--->process_view---->views
views--->urls--->所有中间件(middleware的process_response)--->wsgi--->客户端 ps: 在中间件的process_request已经知道要执行哪个视图函数了(根据request已经获取url,根据url获取对应视图函数)
3 中间件
# 中间件
- django一个请求的生命周期
简单来说就是: wsgi 和django 客户端-->request--->wsgi--->所有中间件(middleware的process_request)--->process_view---->views
views--->urls--->所有中间件(middleware的process_response)--->wsgi--->客户端 ps: 在中间件的process_request已经知道要执行哪个视图函数了(根据request已经获取url,根据url获取对应视图函数) - 自己定义中间件Class MyMiddle(中间件是一个类)
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponse class MyMiddle1(MiddlewareMixin):
def process_request(self, request):
print('m1.process.request') def process_view(self, request,callback, callback_args, callback_kwargs):
print('m1.process_view')
print(callback) # 这个callback,就是url对应的视图函数
# return callback(request, *callback_args, **callback_kwargs) def process_response(self, request, response):
print('m1.processs.response')
return response # 一定要有这个,不然会报错 def process_exception(self, request, exception):
print('m1.process_exception')
# print(exception) class MyMiddle2(MiddlewareMixin):
def process_request(self, request):
print('m2.process.request') def process_view(self,request, callback, callback_args, callback_kwargs):
print('m2.process_view') def process_response(self, request, response):
print('m2.processs.response')
return response # 一定要有这个,不然会报错 def process_exception(self, request, exception):
print('m2.process_exception')
# print(exception) - 注册中间件
MIDDLEWARE = [
#省略前面部分,追加后面两个
'mid.MyMiddle1',
'mid.MyMiddle2',
] - 一个request的完整生命周期
https://www.processon.com/diagraming/5a0ce2bae4b06bed41d126e1 正常的流程:
m1.process.request
m2.process.request
m1.process_view
m2.process_view
views
m2.processs.response
m1.processs.response 如果有exception:
m1.process.request
m2.process.request
m1.process_view
m2.process_view
views
m2.process_exception
m1.process_exception
m2.processs.response
m1.processs.response - 中间件应用
对所有请求(或一部分请求)做统一操作(比如缓存)--可以用中间件实现
对每个请求做判断,如果缓存有,就返回,否则就到views读数据库,
[oldboy-django][2深入django]django一个请求的生命周期 + WSGI + 中间件的更多相关文章
- YII框架一个请求的生命周期
用户向入口脚本 web/index.php 发起请求. 入口脚本加载应用配置并创建一个应用实例去处理请求. 应用通过请求组件解析请求的路由. 应用创建一个控制器实例去处理请求. 控制器创建一个操作实例 ...
- Django组件---Django请求生命周期和中间件
Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...
- 05.Django-form表单与请求的生命周期
Django中请求的生命周期 HTTP请求及服务端响应中传输的所有数据都是字符串 步骤 用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务器 url经过wsgi和中间件,到达路由映射表,在 ...
- Djngo 请求的生命周期
1.Django请求的生命周期 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 /index/ -> 函数或类.as_view() / ...
- Minor【 PHP框架】2.第一个应用与请求的生命周期
框架Github地址:github.com/Orlion/Minor (如果觉得还不错给个star哦(^-^)V) 框架作者: Orlion 知乎:https://www.zhihu.com/peop ...
- Mvc请求的生命周期
ASP.NET Core : Mvc请求的生命周期 translation from http://www.techbloginterview.com/asp-net-core-the-mvc-req ...
- Envoy 代理中的请求的生命周期
Envoy 代理中的请求的生命周期 翻译自Envoy官方文档. 目录 Envoy 代理中的请求的生命周期 术语 网络拓扑 配置 高层架构 请求流 总览 1.Listener TCP连接的接收 2.监听 ...
- JDK HttpClient 单次请求的生命周期
HttpClient 单次请求的生命周期 目录 HttpClient 单次请求的生命周期 1. 简述 2. uml图 3. Http连接的建立.复用和降级 3.1 调用流程及连接的建立和复用 3.2 ...
- (四)一个bug的生命周期
Bug的属性 Bug重现环境 这个应该是我们重现BUG的一个前提,如果没有这个前提,我们可能会无法重现问题,或者根本就无从下手. • 操作系统 这个是一般软件运行的一大前提,基本上所有的软件都依赖于操 ...
随机推荐
- LeetCode Length of Last Word 最后一个字的长度
class Solution { public: int lengthOfLastWord(const char *s) { ; string snew=s; ,len=strlen(s); ]; ) ...
- [习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组
[习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组 之前的范例,使用字符串.文字来记录将删除的文章ID 后续会有很多小缺 ...
- POJ1061 青蛙的约会 __一维世界的爱情
由于今天上午在做数论知识的笔记,发现那时候赵老师讲的线性丢番图(求ax+by=c的特解)部分完全搞不懂,后来网上查了一下才发现这个公式就是求同余方程,所用方法就是扩展欧几里得算法.正好红皮书上有这么一 ...
- 一个普通 iOS 码农的几个小项目相关知识点总结
题记:在开发的路途上,有的人走的很深很远,而对于停留在初级阶段的我来说,还要学的.经历的还有很多... list sqlite 数据库中,当把表里的数据都清空时,下次插入的数据的 id 主键不会从 0 ...
- Liunx开发(Extjs4.1+desktop+SSH2超强视频教程实践)(1)
下周一出差宁波了,周六日就折腾点视频: 跟着视频教程开发,不过开发环境换linux,上月找工作,某个吉祥物是松鼠的公司要求用linux开发,没用过的,连面试机会都不给,极其高冷:好吧,咱就试试,用li ...
- 几个重要的开源视频会议SIP协议栈
视频会议系统由于需要与不同的终端进行连接,因此我们需要视频会议终端遵循统一的协议,H.323协议是视频会议软件使用最广泛的协议栈,但H.323设计得较为复杂,用户在调用H.323协议过程较多,因此利用 ...
- 五、react中父子组件间如何传值
1.父组件向子组件传递数据:父组件绑定属性值传给子组件,子组件通过this.props()接受. 2.子组件向父组件传递数据:子组件绑定一个方法,方法中通过this.props.父组件方法名(参数)传 ...
- angular路由学习笔记
文章目录 标签routerLink路由传递参数 url中get传值 定义路由 获取参数 配置动态路由 定义路由 获取参数 API js路由跳转 配置动态路由 定义路由 获取参数 get传值 定义路由 ...
- XAMPP安装过程中,出现的问题
这次运行一个简单的前端(html+css+js+ajax)+php后端项目,运行XAMPP的时候,出现两个问题: phpmyadmin运行不起来,一直报1544错误 请求本地图片及php文件报403错 ...
- Spring Boot 2.x零基础入门到高级实战教程
一.零基础快速入门SpringBoot2.0 1.SpringBoot2.x课程全套介绍和高手系列知识点 简介:介绍SpringBoot2.x课程大纲章节 java基础,jdk环境,maven基础 2 ...