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

 

posted @ 2019-06-17 16:46  追赶菜鸟  阅读(199)  评论(0编辑  收藏  举报