• django之中间件(middleware)


    一、中间件的概念

      中间件是Django请求与响应处理的钩子框架,是一个轻量级的插件系统。中间件用于在视图函数执行之前和执行之后做一些预处理和后处理操作,功能类似装饰器。它的表现形式是一个Python类。简而言之就是处理请求和响应。

     二、中间件在django中的应用

      在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件。

     每一个中间件中都有继承

    from django.utils.deprecation import MiddlewareMixin

    自MiddlewareMixin类的五个方法方法,一般常用的就是对处理请求的process_request(self, request)和处理响应的process_response(self, request, response)这两个方法就行重载,在自定义中间件后,还要在settings.pyd的MIDDLEWARE_CLASSES中进行注册,要注意的是注册的位置会影响其执行的执行的顺序,中间件执行的

    顺序见上图的箭头顺序。

    process_request(self,request) :
    执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
    process_view(self, request, callback, callback_args, callback_kwargs):
    调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
    process_template_response(self,request,response):
    在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
    process_exception(self, request, exception)
    当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
    process_response(self, request, response)
    所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象

    三、django中间件源码示例

    def get_user(request):
        if not hasattr(request, '_cached_user'):
            request._cached_user = auth.get_user(request)
        return request._cached_user
    
    
    class AuthenticationMiddleware(MiddlewareMixin):
        def process_request(self, request):
            assert hasattr(request, 'session'), (
                "The Django authentication middleware requires session middleware "
                "to be installed. Edit your MIDDLEWARE%s setting to insert "
                "'django.contrib.sessions.middleware.SessionMiddleware' before "
                "'django.contrib.auth.middleware.AuthenticationMiddleware'."
            ) % ("_CLASSES" if settings.MIDDLEWARE is None else "")
            request.user = SimpleLazyObject(lambda: get_user(request))

    上面这个用户验证的中间件只重载了处理请求的方法,所以我们自定义中间件时要结合自己的需要重载。

    四、自定义中间件流程

      第一步:在主目录下创建存放自定义中间价类的模块文件middlewares.py

      第二步:编写自定义中间件类

        第一种方式:

    from django.utils.deprecation import MiddlewareMixin
    from django.http.response import HttpResponse
    
    
    class UserMiddlerware(MiddlewareMixin):
        def process_request(self, request):
            print("自定义process_request")
            return None
    
        def process_view(self, request, callback, callback_args, callback_kwargs):
            return None
    
        def process_template_response(self, request, response):
            return response
    
        def process_response(self, request, response):
            return response
    
        def process_exception(self, request, exception):
            return HttpResponse(exception)

        第二种方式:

    from User.models import User
    
    
    class UserMiddleware(object):
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            # request到达view之前执行代码
            username = request.session.get("username", "未登录")
            user = User.objects.filter(username=username).first()
            if user:
                setattr(request, "myuser", user.username)
            else:
                setattr(request, "myuser", "未登录")
            response = self.get_response(request)
            # response到达用户浏览器之前执行的代码
            return response

        建议:使用第一种方式编写自定义中间件,代码的执行流程比较清晰。

      第三步:注册中间件

        注意:如果你的process_request依赖其他中间价的process_request,必须要放在所依赖的中间件的后面。

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'blog.middlewares.UserMiddleware'
    ]

    blog是项目名,先找到文件所在的位置,把自定义的中间件的类添加到MIDLEWARE的列表当中。

  • 相关阅读:
    一个人是否靠谱,闭环很重要(深度)
    远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
    如何量化考核技术人的 KPI?
    ECharts
    Spring IO Platform介绍
    百亿级日访问量的应用如何做缓存架构设计?
    大型分布式系统中的缓存架构
    Delphi实现屏幕截图、窗口截图、指定区域截图
    Delphi窗体重绘API
    GdiPlus 一个给 Delphi 提供的新的 GDI+ 接口很好用!
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12469721.html
Copyright © 2020-2023  润新知