关于Django中间件自己的一点理解

Django中间件我觉得是一个非常重要的东西,所以把自己的一些理解分享出来,哪里有不对的还希望大家可以帮助我修改。

 

因为是自己写的代码,所以就把代码粘过来了,里边每一部分都会有自己的理解和注释,见谅!

 

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse


#对于有些Django没有MiddleMixin类,就在上边自己写一个,但是这时上边的类引用就不要再引了
# class MiddlewareMixin(object):
#     def __init__(self, get_response=None):
#         self.get_response = get_response
#         super(MiddlewareMixin, self).__init__()
#
#     def __call__(self, request):
#         response = None
#         if hasattr(self, 'process_request'):
#             response = self.process_request(request)
#         if not response:
#             response = self.get_response(request)
#         if hasattr(self, 'process_response'):
#             response = self.process_response(request, response)
#         return response

#有的Django版本不支持上边的MiddleMixin类,这时你需要自己在上边写一个MiddleMixin类
#定义完自己的中间件加到SETTINGS文件里就可以用了。
class M1(MiddlewareMixin):
    def process_request(self,request):
        # if request.path_info=='login':
        #     return None
        # elif request.session.get('user'):
        #     return redirect('login')
        print('M1_process_request',request)

    def process_response(self,request,response):
        print('M1_request_response')
        return response
#关于中间件的process_view函数,其实就是帮助路由匹配系统匹配视图函数的中间件,所以在执行完process_request函数以后,会执行
#这里的process_view来匹配视图函数,匹配到以后再去执行视图函数的函数体(注意这里的匹配到并不是匹配到就结束,而是全部都要匹
# 配一遍),所以process_view的执行结果会在视图函数之前,之后再去执行exception函数(如果匹配到异常的话,注意这里的异常只捕
#捉一次),最后再去执行process_response函数

#对于在process_view函数中直接返回结果的情况,这时不再执行接下来的process_view函数,也不再执行视图函数,而是直接从最底端
# 开始执行倒序的process_response函数,这时可以说process_view函数替代了原来的视图函数。
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('M1.process_view')

    def process_exception(self,request,response):
        print('M1.process_exception')
        return HttpResponse('Internal_Error(M1),This is PROCESS_EXCEPTION_HANDLING_FUNCTION')

class M2(MiddlewareMixin):
    def process_request(self,request):
        print('M2_process_request')

    def process_response(self,request,response):
        print('M2_process_response')
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('M2.process_view')

    def process_exception(self,request,response):
        print('M2.process_exception')
        return HttpResponse('Internal_Error(M2),This is PROCESS_EXCEPTION_HANDLING_FUNCTION')

#中间件流程总结:
#①.在没有process_view或者process_exception时,浏览器的访问请求通过与Django独立的wsgi模块建立socket链接,在这之后通过Django
#设置的中间件(本身是类,并且可以调用类下定义的方法),顺序是按照配置文件里的中间件中的列表顺序执行中间件的process_request部分,
#遇到不是return None的process_request就会中断,然后从当前终止的位置倒序执行process_response

#②.如果中间件定义了process_view,这时就会顺序执行process_request,执行结束,再从头开始执行process_view以及request_response
#的中间件方法.

#具体显示效果如下:
# M1_process_request <WSGIRequest: GET '/favicon.ico'>
# M2_process_request
# Not Found: /favicon.ico
# [18/Sep/2017 18:32:58] "GET /favicon.ico HTTP/1.1" 404 2061
# M2_process_response
# M1_request_response
# [18/Sep/2017 18:32:59] "GET / HTTP/1.1" 200 62
# M1_process_request <WSGIRequest: GET '/'>
# M2_process_request
# M1.process_view
# M2.process_view
# This is Index View_Function
# M2.process_exception
# M2_process_response
# M1_request_response

#③对于process_response,一定要有返回值,不然访问页面时,后端会报错。
#同时,中间件的process_request处理完请求,视图函数也处理完请求返回值时,倒序通过process_response的return返回值,期间我们
#可以通过process_response处理视图函数返回的值,从而达到修改视图函数返回结果的效果。

  

转载于:https://www.cnblogs.com/575dsj/p/7544860.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值