Django学习10

django请求生命周期

请求 -- 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_view方法:
    def process_view(self, request, view_func, view_args, view_kwargs):
        ...
# 执行视图函数之前执行;
# view_func是Django即将使用的视图函数.

3.process_exception方法:
    def process_exception(self, request, exception):
        ...
# 视图函数出错才会执行.

4.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

5.process_response方法(*):
    def process_response(self,request,response):
		...
		return response
# response是视图函数返回的HttpResponse对象.该方法必须返回HttpResponse对象;
# 多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序 倒序 执行的.


小结:搞清楚整个django请求的生命周期是重点,这样才能知道哪个环节可以拓展.中间件的学习重点在于搞清楚中间件的执行顺序,以及其方法的执行顺序,在做这方面项目或练习的时候最好画个草图,这样逻辑会更加清晰.

原文地址:https://www.cnblogs.com/straightup/p/13468288.html