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 + 中间件的更多相关文章

  1. YII框架一个请求的生命周期

    用户向入口脚本 web/index.php 发起请求. 入口脚本加载应用配置并创建一个应用实例去处理请求. 应用通过请求组件解析请求的路由. 应用创建一个控制器实例去处理请求. 控制器创建一个操作实例 ...

  2. Django组件---Django请求生命周期和中间件

    Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...

  3. 05.Django-form表单与请求的生命周期

    Django中请求的生命周期 HTTP请求及服务端响应中传输的所有数据都是字符串 步骤 用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务器 url经过wsgi和中间件,到达路由映射表,在 ...

  4. Djngo 请求的生命周期

    1.Django请求的生命周期 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 /index/ -> 函数或类.as_view() / ...

  5. Minor【 PHP框架】2.第一个应用与请求的生命周期

    框架Github地址:github.com/Orlion/Minor (如果觉得还不错给个star哦(^-^)V) 框架作者: Orlion 知乎:https://www.zhihu.com/peop ...

  6. Mvc请求的生命周期

    ASP.NET Core : Mvc请求的生命周期 translation from http://www.techbloginterview.com/asp-net-core-the-mvc-req ...

  7. Envoy 代理中的请求的生命周期

    Envoy 代理中的请求的生命周期 翻译自Envoy官方文档. 目录 Envoy 代理中的请求的生命周期 术语 网络拓扑 配置 高层架构 请求流 总览 1.Listener TCP连接的接收 2.监听 ...

  8. JDK HttpClient 单次请求的生命周期

    HttpClient 单次请求的生命周期 目录 HttpClient 单次请求的生命周期 1. 简述 2. uml图 3. Http连接的建立.复用和降级 3.1 调用流程及连接的建立和复用 3.2 ...

  9. (四)一个bug的生命周期

    Bug的属性 Bug重现环境 这个应该是我们重现BUG的一个前提,如果没有这个前提,我们可能会无法重现问题,或者根本就无从下手. • 操作系统 这个是一般软件运行的一大前提,基本上所有的软件都依赖于操 ...

随机推荐

  1. 详细步骤教你安装yii高级应用程序和配置composer环境

    现在开始工作,应公司的要求,要开始接触yii了,作为一个没有碰过yii的小白,首先一个问题就是怎么去安装高级程序应用,过程不麻烦,但是也需要细心和耐心,百度资料里面的教程都不太全,漏这漏那的,所以在这 ...

  2. HTML5新特性 video '&#x25BA'

    var play = document.createElement('button') play.setAttribute('title','play') play.innerHTML = '►' 创 ...

  3. hdu-3549 Flow Problem---最大流模板题(dinic算法模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3549 题目大意: 给有向图,求1-n的最大流 解题思路: 直接套模板,注意有重边 传送门:网络流入门 ...

  4. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...

  5. vuejs计算属性和侦听器

    <div id='root'> 姓:<input v-model='firstName'/> 名:<input v-model='secondName'/> < ...

  6. 最近面试前端岗位,汇总了一下前端面试题(JS+CSS)

    JavaScript 运行机制 1. 单线程(用途决定,需要与用户互动以及操作DOM) 2. 分同步任务(主线程)与异步任务(任务队列),只有任务队列通知主线程某个任务可以执行了,该 任务才会进入主线 ...

  7. 安装软件出现缺少vcruntime140dll的解决方法

    转自:http://jingyan.baidu.com/article/49711c617e4000fa441b7c92.html 首先下载vc++2015,注意自己系统是32位还是64位的,下载对应 ...

  8. angular2新建组件

    1,使用ng g c hello 创建一个新的组件 它创建了4个文件,并更新了app.module.ts 如果想访问这个组件,只需要添加它的路由 成功访问这个组件 Import语句定义了我们需要用到的 ...

  9. 随机数生成器java实现

    /** 设计一个随机数生成器,可以产生给定平均概率的随机证书序列. 即输入一个概率比如:0.9 然后输入要求的概率样本个数比如:1000 输出一个接近所输入的0.9的概率数(要求样本数越大越接近输入的 ...

  10. PowerDesigner导入Excel模板生成实体

        在Excel里整理好的表模型数据,可直接导入PowerDesigner.此功能通过PowerDesigner的脚本功能来实现,使用起来也简单.具体操作方法:     打开PowerDesign ...