zoukankan      html  css  js  c++  java
  • Django中间件

    在django中叫中间件,在其他web框架中,有的叫管道,httphandle,本次主要介绍定义中间件方法、中间件中的方法、中间件的作用等。 

    自定义中间件

    1、中间件为:函数

    定义一个中间件工厂函数,然后返回一个可以别调用的中间件。

    中间件工厂函数需要接收一个可以调用的get_response对象。

    返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

    def simple_middleware(get_response):
        # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
    
        def middleware(request):
            # 此处编写的代码会在每个请求处理视图前被调用。
    
            response = get_response(request)
    
            # 此处编写的代码会在每个请求处理视图之后被调用。
    
            return response
    
        return middleware

    例如,在users应用中新建一个middleware.py文件,

    def my_middleware(get_response):
        print('init 被调用')
        def middleware(request):
            print('before request 被调用')
            response = get_response(request)
            print('after response 被调用')
            return response
        return middleware

    定义好中间件后,需要在settings.py 文件中添加注册中间件

    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',
        'users.middleware.my_middleware',  # 添加中间件
    ]

    定义一个视图进行测试

    def demo_view(request):
        print('view 视图被调用')
        return HttpResponse('OK')

     执行结果

      

      注意:Django运行在调试模式下,中间件init部分有可能被调用两次。

    2、中间件为:类

    我们可以自己写一个类,作为中间件,但是必须继承MiddlewareMixin, 所以需要导入:from django.utils.deprecation import MiddlewareMixin

    中间件合法的5种方法:

    process_request(self, request): # 请求时过滤

    #request:请求信息, callback:函数名, callback_args:函数可变参数(元组调用), callback_kwargs:函数关键字参数(字典调用) process_view(self, request, callback, callback_args, callback_kwargs) # 视图函数过滤
    process_exception(self, request, exception) # views内代码异常执行,exception:异常信息
    process_template_response(self, request, exception) # 如果views返回的对象有render方法 则该函数被执行
    process_response(self, request, response): # 返回时过滤

     

     中间件的各方法执行顺序

     

    自定义中间件步骤:

    【1】在App目录下创建名为middlewares的包

    【2】在包中创建自己的中间件类文件

    verifycodeMiddleware.py
    
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect
    
    
    class VerifycodeMiddleware(MiddlewareMixin):
        def process_request(self, request):
            print("***************", request.path)
            if request.path == "/login/" and request.method == "POST":
                # 判断验证码
                verifycode = request.POST.get("verifycode")
                if not verifycode.upper() == request.session.get("verifycode").upper():
                    return redirect("/login/")

    【3】在settings.py文件中配阿置MIDDLEWARE

    'myApp.middlewares.verifycodeMiddleware.VerifycodeMiddleware'

    中间件的使用场景

    1.做IP限制

    放在中间件类的列表中,阻止某些ip访问;

    2.URL访问过滤

    如果用户访问的是logo视图(放过)

    如果访问其他视图,需要检测是否已经有session,已经有了放行,如果没有返回login,这样就省的在多个视图函数上写装饰器了!

    3.缓存

    客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层执行视图函数

    参考:

    https://blog.csdn.net/qq_31479309/article/details/80080851
    https://segmentfault.com/a/1190000015607283

    https://www.cnblogs.com/zhaof/p/6281541.html

  • 相关阅读:
    Cannot retrieve the latest commit at this time.
    Github上搭建个人博客记录
    ESPCN超分辨率汇总
    ESPCN处理彩色图像代码
    配置caffe过程中,生成解决方案出错。无法打开包括文件: “gpu/mxGPUArray.h”
    未定义变量 "caffe" 或类 "caffe.reset_all"
    windows下caffe安装配置、matlab接口
    Python3:pyecharts数据可视化插件
    Django:用户登录实例
    Django:提交表单时遇到403错误:CSRF verification failed
  • 原文地址:https://www.cnblogs.com/rgxx/p/11040613.html
Copyright © 2011-2022 走看看