中间件
流程

客户端请求 ->-> M1.process_request -> M2.process_request -> ... -> Mn.process_request-> M1.process_view -> M2.process_view -> ... -> Mn.process_view-> view函数有异常->Mn.process_exception -> ... -> M2.process_exception -> M1.process_response无异常-> Mn.process_response -> ... -> M2.process_response -> M1.process_response-> 客户端
自定义中间件
在app中创建middleware.py文件
from django.utils.deprecation import MiddlewareMixinclass M1(MiddlewareMixin):def process_request(self, request):"""如果此处直接return 则不执行view函数从当前中间件的process_response 开始执行返回"""return HttpResponse('hehe')def process_view(self,request, callback, callback_args, callback_kwargs):"""callback: views函数callback_args:callback_kwargs: views函数参数如果执行callback函数即执行view函数 则将跳过后面的process_view函数接着执行 process_response 函数"""return callback(request, *callback_args, **callback_kwargs)def process_response(self, request, response):return responsedef process_exception(self, request, exception):"""view有异常时才出发如果处理的异常则不继续执行后面的process_exception"""passdef process_template_response(self, request, response):"""视图函数中有render返回时才会执行"""pass
'''settings.py中注册--------------------------中间件的顺序按照list中顺序执行'''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',# ...]
上下文渲染器
可解决在多个template中都需要显示相同的数据,无需在每个view中都传一次值
自定义上下文渲染器
在项目同名的目录中(即settings.py同级目录中)创建context_processor.py文件
def myuser(request):"""返回字典,key名即可在template中直接调用"""return {'key1': 'value1'}
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',# 添加配置'projectname.context_processor.myuser',],},},]
