django 自定义中间件

885 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

什么是中间件(middleware)及中间件(middleware)的工作原理

中间件(Middleware)是一个镶嵌到django的request/response处理机制中的一个钩子(hooks) 框架。它是一个可以修改django全局输入或输出的一个底层插件系统。

上面这段是Django官方文档中对于Middleware的介绍,听上去非常抽象难懂,小编我来尝试用浅显的语言再介绍一遍吧。我们首先要了解下Django的request/response处理机制,然后再看看Middleware在整个处理机制中的角色及其工作原理。

Django自带中间件介绍

当你创建一个新django项目时,你会发现settings.py里已经注册了一些Django自带的中间件,每个中间件都负责一个特定的功能。

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',
]

SecurityMiddleware:为request/response提供了几种安全改进,无它不安全

SessionMiddleware:开启session会话支持,无它无session

CommonMiddleware:基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;如果PREPEND_WWW设为True,前面缺少 www.的url将会被重定向到相同但是以一个www.开头的url。

CsrfViewMiddleware:添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值,无它无csrf保护

AuthenticationMiddleware:在视图函数执行前向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户,无它用不了request.user

MessageMiddleware:开启基于Cookie和会话的消息支持,无它无message

XFrameOptionsMiddleware:对点击劫持的保护

Django的中间件执行顺序

当你在settings.py注册中间件时一定要要考虑中间件的执行顺序,中间件在request到达view之前是从上向下执行的,在view执行完后返回reponse过程中是从下向上执行的

自定义中间件

函数实现方式

def simple_middleware(get_response):
 
    def middleware(request):
    
        # request请求到达视图函数执行前的代码
        response = get_response(request)
        
        # the view is called. 视图函数执行后的代码
        return response
 
    return middleware

类实现方式

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        
    def __call__(self, request):

        # 视图函数执行前的代码
        response = self.get_response(request)
        
        # the view is called. 视图函数执行后的代码
        return response