django之自定义中间件
1创建middlewares.py中间件
方法1:用函数的形式
from .models import User
def front_user_middleware(get_response):
# 1执行到达视图函数之前的初始化代码(django启动就会执行)
print('初始化代码')
# 这个函数名随便
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 #注意不要占用user关键词防止冲突
except:
# 没有值的时候传递None防止视图中调用时候出错
request.front_user = None
else:
request.front_user = None
# 2在这个代码之前的代码,是request到view之前的代码
response = get_response(request)
# 3这之后的代码是response到达浏览器前的代码
print('response到达浏览器之前')
return response
return middleware
方法2:用类的形式
class FrontUserMiddleware(object):
def __init__(self,get_response):
# 1执行到达视图函数之前的初始化代码(django启动就会执行)
print('初始化代码')
self.get_response = 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 # 注意不要占用user关键词防止冲突
except:
# 没有值的时候传递None防止视图中调用时候出错
request.front_user = None
else:
request.front_user = None
# 2在这个代码之前的代码,是request到view之前的代码
response = self.get_response(request)
# 3这之后的代码是response到达浏览器前的代码
print('response到达浏览器之前')
return response
2settings.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',
# 'front.middlewares.front_user_middleware', 用函数的形式
'front.middlewares.FrontUserMiddleware', #用类的形式
]
3全局视图中可以调用中间件传递给request的对象
def index(request):
print('这是返回response的代码')
# 使用中间件后,所有的视图都可以调用中间件中传入的对象
print(request.front_user.username)
return render(request, 'index.html')