位置:
- 推荐在需要用到中间件的应用下创建
middleware.py
文件,将中间件定义在该文件内
定义
1. 函数式:
def judge_login_middleware(get_response):
# 执行初始化的代码块
def middleware(request):
print('request-view之间的代码块')
user_id = request.session.get("user_id")
if user_id:
try:
user = User.objects.get(pk=user_id)
request.front_user = user
except:
request.front_user = None
else:
request.front_user = None
response = get_response(request)
print('response到达浏览器之间的代码块')
return response
return middleware
2. 类式:
class JudgeLoginMiddleware(object):
def __init__(self, get_response):
print('执行初始化的代码块')
self.get_response = get_response
def __call__(self, request):
print('request-view之间的代码块')
user_id = request.session.get("user_id")
if user_id:
try:
user = User.objects.get(pk=user_id)
request.front_user = user
except:
request.front_user = None
else:
request.front_user = None
response = self.get_response(request)
print('response到达浏览器之间的代码块')
return response
3. 将被弃用的一种方式:
from django.utils.deprecation import MiddlewareMixin
class JudgeLoginMiddlewareMixin(MiddlewareMixin):
def __init__(self, get_response):
print('执行初始化的代码块')
super(JudgeLoginMiddlewareMixin, self).__init__(get_response)
def process_request(self, request):
"""request到view之间执行的代码块"""
user_id = request.session.get("user_id")
if user_id:
try:
user = User.objects.get(pk=user_id)
request.front_user = user
except:
request.front_user = None
else:
request.front_user = None
def process_response(self, request, response):
"""response到浏览器之间的代码块"""
return response
注册
- 在
settings.py
文件中进行注册
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', # 1.处理url最后的 / 2.user-agent:反爬虫
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', # 给request对象添加一个user对象
'django.contrib.messages.middleware.MessageMiddleware', # 处理消息
'django.middleware.clickjacking.XFrameOptionsMiddleware', # clickjacking攻击保护
...
...
'user.middleware.JudgeLoginMiddlewareMixin'
]
- 中间件反爬虫,依赖于
CommonMiddleware
中间件
# settings.py
import re
DISALLOWED_USER_AGENTS = [
re.compile(r'^\s$ | ^$') # 请求头为空不处理
re.compile(r'.PhantomJS.*') # 请求头包含PhantomJS时不处理
]
- 使用中间件将响应内容进行压缩,提高响应速度,如果小于200个长度,则不会被压缩,依赖于
GZipMiddleware
中间件,该中间件需要手动注册,必须放在UpdateCacheMiddleware
之后,如果没有UpdateCacheMiddleware
, 则放在SecurityMiddleware
之后。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.middleware.gzip.GZipMiddleware'
'django.contrib.sessions.middleware.SessionMiddleware',
]