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

  • 相关阅读:
    列表与数组 Perl入门第三章
    北京地区-医类汇总
    via/route blockage/size blockage/wire/pin guide/pin blockage/partition
    dbGet(三)
    dbGet(二.一)hinst
    微服务是什么?
    Docker入门 四 Swarms集群
    Docker入门 三 用服务来扩展和负载均衡你的应用
    Linux2.2路径、删除目录及文件
    Linux2.1系统目录结构、ls、文件类型、alias
  • 原文地址:https://www.cnblogs.com/rgxx/p/11040613.html
Copyright © 2011-2022 走看看