django中间件
中间件介绍:
中间件是在request和response处理过程中的一个插件。比如在request到达视图函数之前,我们可以使用中间件来做一些相关的事情,比如可以判断当前这个用户有没有登陆,如果登陆了就绑定一个user对象到request上。也可以在response到达浏览器之前,做一些相关的处理,比如想统一在response上设置一些Cookie信息等。
自定义中间件
中间件有两种方式创建,函数、类。如果该中间件属于某个app的,那么可以在该app下创建一个py文件来写中间件代码。也可以创建一个py包,用来存放所有中间件。
写好的中间件要添加到MIEDDLEWARE最后面,否则不会生效。
函数创建中间件:
# /MyDjango/app1/middlewares.py
def simple_middleware(get_response): # 函数名可自定义
print("项目第一次运行执行的代码")
def middleware(request): # 函数名可自定义
print("客户端请求数据到达视图函数前执行的代码")
response = get_response(request) # 该代码会执行视图函数
print("服务器响应数据到达浏览器前执行的代码")
return response # 必须返回响应
return middleware
# 返回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',
# 添加自定义中间件
"app1.middlewares.simple_middleeware"
]
Copy
类创建中间件
# /MyDjango/app1/middlewares.py
class SimpleMiddleware: # 类名可自定义
def __init__(self, get_response): # 参数get_response必须有
print("项目第一次运行执行的代码")
self.get_response = get_response # 保存get_response对象,方便以后调用
def __call__(self, request): # 参数request必须有
print("客户端请求数据到达视图函数前执行的代码")
response = self.get_response(request) # 该代码会执行视图函数
print("服务器响应数据到达浏览器前执行的代码")
return response # 必须返回响应
# 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',
# 添加自定义中间件
"app1.middlewares.SimpleMiddleware"
]
Copy
执行顺序:
"项目第一次运行执行的代码" ==> "客户端请求数据到达视图函数前执行的代码" ==> "服务器响应数据到达浏览器前执行的代码"
如果还是看不懂,可以Copy代码到自己项目上测试,看看控制台打印内容就明白了。
内置中间件详解
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 安全处理中间件
'django.contrib.sessions.middleware.SessionMiddleware', # 提供request.session对象
'django.middleware.common.CommonMiddleware', # 自动添加斜杠和反爬虫
'django.middleware.csrf.CsrfViewMiddleware',# CSRF保护的中间件
'django.contrib.auth.middleware.AuthenticationMiddleware', # 提供request.user对象
'django.contrib.messages.middleware.MessageMiddleware', # 消息相关的中间件
'django.middleware.clickjacking.XFrameOptionsMiddleware', # clickjacking保护中间件
]
Copy
反爬虫之请求头验证
# settings.py
import re
DISALLOWED_USER_AGENTS = [
re.compile(r'^\s$|^$'),
re.compile(r'.*PhantomJS$.*')
]
Copy