1. 生命周期
Django 生命周期为: 用户请求发起对url的请求→ wsgiref模块→django中间件→django(视图url对应函数,模型数据库交互,html模版渲染)→django中间件 → wsgiref模块 →用户看到的页面。
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
Django框架在这里运行
Django 中间件
Django (视图 模版 orm) Django 中间件
。。。。。
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)
print("Serving HTTP on port 8000...")
httpd.serve_forever()
2. Django HTTP请求流程
3. 中间件的五种方法
什么是中间件?
中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件负责做一些特定的功能。
3.1 process_request
执行时间:在视图函数之前,在路由匹配之前
参数:
request:请求对象,与视图中用到的request参数是同一个对象
返回值:
None:按照正常的流程走
HttpResponse:接着倒序执行当前中间件的以及之前执行过的中间件的
process_response方法,不再执行其它的所有方法
执行顺序:按照MIDDLEWARE中的注册的顺序执行,也就是此列表的索引值
3.2 process_response
执行时间:最后执行
参数:
request:请求对象,与视图中用到的request参数是同一个对象
response:响应对象,与视图中返回的response是同一个对象
返回值:
response:必须返回此对象,按照正常的流程走
执行顺序:按照注册的顺序倒序执行
3.3 process_view
执行时间:在process_request方法及路由匹配之后,视图之前
参数:
request:请求对象,与视图中用到的request参数是同一个对象
view_func:将要执行的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)
view_args:url路径中将传递给视图的位置参数的元组
view_kwargs:url路径中将传递给视图的关键值参数的字典
返回值:
None:按照正常的流程走
HttpResponse:它之后的中间件的process_view,及视图不执行,执行所有中间件的process_response方法
执行顺序:按照注册的顺序执行
3.4 process_template_response
此方法必须在视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)时,才被执行
执行时间:视图之后,process_exception之前
参数:
request:请求对象,与视图中用到的request参数是同一个对象
response:是TemplateResponse对象(由视图函数或者中间件产生)
返回值:
response:必须返回此对象,按照正常的流程走
执行顺序:按照注册的顺序倒序执行
3.5 process_exception
此方法只在视图中触发异常时才被执行.
执行时间:视图之后,process_response之前
参数:
request:请求对象,与视图中用到的request参数是同一个对象
exception:视图函数异常产生的Exception对象
返回值:
None:按照正常的流程走
HttpResponse对象:不再执行后面的process_exception方法
执行顺序:按照注册的顺序倒序执行