首页 > 其他 > 详细

Django之中间件

时间:2020-01-14 10:04:54      阅读:62      评论:0      收藏:0      [点我收藏+]

中间件

什么是Django的中间件

完整django请求的生命周期

技术分享图片

如果有中间件其中的请求不通过会这样:

技术分享图片

所以说中间件其实是在路由系统前就会发生的,在django中是一个类,用其中的process_request函数处理;如果views中函数处理完了以后,则也是要经过中间件来处理,通过相关类中的procee_response处理;其实也可以用process_view对视图函数处理,process_exception对view中函数出现异常处理,process_template_response是在视图中返回的对象中含有render方法才执行。

作用:例如可以对于所有的客户请求,在到达路由系统前,作一些验证的工作。也可以作一些视图函数处理后的后期工作。其实就是对请求的事前事后的统一处理。

关于process_view

技术分享图片

技术分享图片

process_exception

视图函数中有异常才处理。

技术分享图片

process_template_response

技术分享图片

执行条件:就是views中返回的对象中含有render方法,才执行。

自定义中间件

步骤一、创建文件夹

步骤二、写中间件的类

(1)、导入:from django.utils.deprecation import MiddlewareMixin
或者在django.utils.deprecation中把MiddlewareMixin整个类复制过来

(2)、写类,需继承MiddlewareMixin,但注意写以下方法:process_request和process_response、process_view、process_exception、process_template_response

# from django.utils.deprecation import MiddlewareMixin


class MiddlewareMixin:  # 推荐这种方式
    def __init__(self, get_response=None):
        self.get_response = get_response
        super().__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, ‘process_request‘):
            response = self.process_request(request)
        response = response or self.get_response(request)
        if hasattr(self, ‘process_response‘):
            response = self.process_response(request, response)
        return response


class M1(MiddlewareMixin):
    def process_request(self, request, *args, **kwargs):
        print(‘m1.process_request‘)

    def process_response(self, request, response):
        print(‘m1.process_response‘)
        return response    # 注意process_response必须有返回值的


class M2(MiddlewareMixin):
    def process_request(self, request, *args, **kwargs):
        print(‘m2.process_request‘)

    def process_response(self, request, response):
        print(‘m2.process_response‘)
        return response

在中间件中实现登陆验证的功能

class Auth(MiddlewareMixin):
    def process_request(self, request, *args, **kwargs):
        if request.path_info == ‘/login/‘:
            return None
            # 请求处理也可以return,return None则到下一个中间件,返回其他则交给同一个中间件的process_response处理
        if not request.session.get(settings.USER_SESSION_KEY):
            # 没有建立会话
            return redirect(‘/login/‘)

步骤三、在settings.py中加入路径
技术分享图片

Django之中间件

原文:https://www.cnblogs.com/Treelight/p/12189994.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!