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

    添加新博客 编辑本博客

    yuan先生博客

    中间件语法

    自定义中间件,继承于MiddlewareMixin

    from django.utils.deprecation import MiddlewareMixin
    class CustomerMiddleware(MiddlewareMixin):
        def process_request(self,request):
            print(request.get_host())
            print("CustomerMiddleware process_request.....")
    View Code

    在setting的MIDDLEWARE中注册新的中间件

    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',
        'app.my_middleware.CustomerMiddleware'
    ]
    View Code

    定义有request和response的中间件。request不用反回执,response一定要有返回值。request有返回HTTPResponse后将会话进行拦截,直接交给自己的response返回给浏览器。

    请求执行request中方法,返回时执行response中的方法

    class CustomerMiddleware2(MiddlewareMixin):
        def process_request(self,request):
            print(request.get_host())
            print("CustomerMiddleware process_request.....")
        def process_response(self,request,response):
            print("CustomerMiddleware2 response.....")
            #response必须有返回值
            return response
    View Code

    process_view()

    class CustomerMiddleware3(MiddlewareMixin):
        def process_request(self,request):
            print(request.get_host())
            print("CustomerMiddleware process_request.....")
        def process_response(self,request,response):
            print("CustomerMiddleware2 response.....")
            #response必须有返回值
            return response
        def process_view(self,request,callback,callback_args,callback_kwargs):
            #这里callback就是对应视图函数
            #这里不要返回HTTPResponse,返回就不会朝下继续执行,直接返回向上执行response
            print("CustomerMiddleware3 view")
    View Code

    process_exception()

    在代码正常执行的情况下不会被执行,只要查找到一个HTTPResponse对象,即返回

    class CustomerMiddleware3(MiddlewareMixin):
        def process_request(self,request):
            print(request.get_host())
            print("CustomerMiddleware process_request.....")
        def process_response(self,request,response):
            print("CustomerMiddleware2 response.....")
            #response必须有返回值
            return response
        def process_view(self,request,callback,callback_args,callback_kwargs):
            #这里callback就是对应视图函数
            #这里不要返回HTTPResponse,返回就不会朝下继续执行,直接返回向上执行response
            print("CustomerMiddleware3 view")
        def process_exception(self,request,response,exception):
            #exception为视图函数中的错误信息
            #返回错误的HTTPResponse对象,有一个exception返回即返回,不会一级一级返回
            pass
    View Code

    中间件应用案例

    1. 做ip访问频率限制
    2. 访问视图检测是不是有session验证,有则放行,没有则返回login页面,避免多个视图添加login装饰器

    大量需要验证,则通过中间件实现验证,相反则通过添加装饰器来完成

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect
    from userauth import settings
    class AuthMiddleware(MiddlewareMixin):
        def process_request(self,request):
            white_list=settings.WHITE_LIST
            if request.path in white_list:
                return None#访问白名单路由直接返回None
            if not request.user.is_authenticated:
                #没有通过认证则调转到主页
                return redirect('/login/')
    View Code
  • 相关阅读:
    类 7.2访问控制与封装 笔记
    第七章 类(class)7.1 笔记
    10.4.3反向迭代器Reverse_iterator笔记
    10.4再探迭代器笔记
    10.3.4参数绑定 bind
    10.3lambda表达式笔记
    第10章 10.1-10.3笔记
    关于按下ctrl+z后,之后的cin失效的问题
    构造和改变一个string的其他方法
    BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9354071.html
Copyright © 2011-2022 走看看