这是我参与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