标签:sch ESS 相关 手写 code 行合并 type属性 sel 姓名
请求 -- wsgi封装socket和http协议解包 -- 顺序执行中间件 -- url控制器 -- view视图函数 -- 倒序执行中间件 -- wsgi按http协议封装响应数据 -- 响应
1.应用下创建一个文件夹,文件夹下面创建一个xx.py文件
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self,request):
...
def process_response(self,request,response):
...
return response
2.在settings.py MIDDLEWARE 中写入自定义中间件的路径(多个中间件的话注意摆放顺序)
1.process_request方法(*):
def process_request(self,request):
...
# 它的返回值为None或者HttpResponse对象.返回值如果为None,交给下一个中间件处理,流程正常.如果是HttpResponse对象,则直接开始返回流程,并将该HttpResponse作为response返回给浏览器.
# 多个中间件中的process_request方法是按照MIDDLEWARE中的注册顺序 顺序 执行的.
2.process_response方法(*):
def process_response(self,request,response):
...
return response
# response是视图函数返回的HttpResponse对象.该方法必须返回HttpResponse对象.
# 多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序 倒序 执行的.
3.process_view方法:
def process_view(self, request, view_func, view_args, view_kwargs):
...
# view_func是Django即将使用的视图函数
4.process_exception方法:
def process_exception(self, request, exception):
...
# 视图函数出错才会执行
5.process_template_response方法(用的比较少):
def process_template_response(self, request, response):
...
# 它的参数,request是HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生).
# process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法.注意!此render()不是我们平时模板渲染的方法!
views.py:
def index(request):
print(‘我是index视图函数‘)
def render():
print(‘我是自定义的render‘)
return HttpResponse(‘我是自定义的render方法的返回值‘) # 最后页面拿到的结果是这个
ret = HttpResponse(‘我是index视图函数的返回值‘) # 这个HttpRequest对象的内容没有意义,会被覆盖
ret.render = render # 将自定义的render方法作为属性封装给了HttpRequest对象
return ret
自定义中间件:
def process_template_response(self, request, response):
...
return response # 这个方法也必须要返回response
小结:搞清楚整个django请求的生命周期是重点,这样才能知道哪个环节可以拓展.中间件的学习重点在于搞清楚中间件的执行顺序,以及其方法的执行顺序,在做这方面项目或练习的时候最好画个草图,这样逻辑会更加清晰.
标签:sch ESS 相关 手写 code 行合并 type属性 sel 姓名
原文地址:https://www.cnblogs.com/xc-dh/p/13463674.html