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. 使用CreateProcess函数运行其他程序

    为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数创建一个运行相应程序的进程.其函数原型如下.CreateProcess(appName, co ...

  2. 【洛谷4287】[SHOI2011] 双倍回文(Manacher算法经典题)

    点此看题面 大致题意: 求一个字符串中有多少个长度为偶数的回文串,它的一半也是回文串. \(Manacher\)算法 这应该是\(Manacher\)算法一道比较好的入门题,强烈建议在做这题之前先去学 ...

  3. 2018.5.30 Oracle数据库PLSQL编程---游标的使用

    显示游标的步骤 /* 显示游标处理步骤 1.声明游标 语法结构:cursor 游标名称 is SQL 语句; 2.打开游标 语法结构:open游标名称; 3.提取数据 语法结构:fetch 4.关闭游 ...

  4. Ribbon 负载均衡搭建

    本机IP为  192.168.1.102 1.   新建Maven  项目    ribbon 2.   pom.xml <project xmlns="http://maven.ap ...

  5. CentOS创建不需要输入密码的sudo用户

     linux 怎么让普通用户使用sudo权限不需要输入密码.    在网上看到很多资料,都只说到了在/etc/sudoers添加下列行即可:    username  ALL=(ALL)       ...

  6. Linux学习记录(二)

    1.远程连接工具的使用 实际开发中,Linux服务器都在其他的地方,我们要通过远程的方式去连接Linux并操作它,Linux远程的操作工具有很多,企业中常用的有Puttty.secureCRT.SSH ...

  7. Window_Bat_Scripts—检测特定网段未使用的IP地址

    1.1    脚本名称 Check_IP_Not_Use.bat 1.2    脚本代码 @Echo off set /p input_number=请输入网络位(192.168.1.): IF EX ...

  8. vue layui

    关于 vue中使用layui插件,个人一些小小的心得. 我是全局的引入,在static文件夹里存放layui的完整代码 在index页面中标签引入 <link rel="stylesh ...

  9. js字符串去掉所有空格

    字符串去掉所有空格 "abc 123 def".replace(/\s/g, "") 字符串去掉左右两端空格 " abc 123 def " ...

  10. 04构建之法读书笔记——IT行业的创新

    IT行业的创新: 1.创新的迷思: 灵光一闪现,伟大的创新就紧随其后:大家都喜欢创新:好的想法会赢:创新者都是一马当先:要成为领域的专家,才能创新:技术的创新是关键:成功的团队更能创新 2.创新的时机 ...