process_request⽅法
在执⾏路由前被调⽤,每个请求上都会调⽤,不主动进⾏返回或返回HttpResponse对象
process_request(self, request)
参数:request,是⼀个HttpRequest请求对象
返回值:返回None会继续调⽤下⼀个中间件的process_request⽅法,返回
HttpResponse,则执⾏⾃⼰process_response
process_view⽅法
调⽤视图之前执⾏,每个请求都会调⽤,不主动进⾏返回或返回HttpResponse对象
process_view(self,request,view_func,view_args,view_kwargs)
参数:
request:HttpRequest对象
view_func:是⼀个即将调⽤的视图函数,不是字符串函数名
view_args:传递给视图函数的位置参数
view_kwargs:传递给视图函数的关键字参数
返回值:如果返回None,会继续执⾏处理此请求,然后调⽤下⼀个中间件的
process_view,直⾄执⾏视图函数;如果返回HttpResponse,则直接执⾏最
后⼀个中间件的process_response
process_template_response⽅法
在视图刚好执⾏完后进⾏调⽤,只要视图返回⼀个render⽅法返回的
对象,就会调⽤process_template_response,不主动进⾏返回或返回HttpResponse对象
process_template_response(self, request, response)
参数:request HttpRequest对象
response 是⼀个由Django view或者中间件返回的
TemplateResponse 对象
返回值: 必须返回⼀个render⽅法执⾏后的response对象,它可以修改
view中返回的 response.template_name 和 response.context_data,
或者为view返回的模板增加⼀个商标等等。你不需要明确的渲染响应,当所
有的temp
process_response
所有响应返回浏览器之前调⽤,每个请求都会调⽤,返回HttpResponse对象
process_response(self,request,response)
参数:request HttpRequest对象
response HttpResponse对象
返回值:必须是HttpResponse对象
process_exception
当视图抛出异常时调⽤,返回None或返回HttpResponse对象
process_exception(self,request,exception)
参数:request: HttpRequest 对象
exception:view函数中raise的Exception对象,当view 函数raise
⼀个exception的时候调⽤process_exception
可实现功能
统计
⿊名单
⽩名单
界⾯友好化(捕获异常)
实现
#App下middleware.py
import json
import sys
from django.views.debug import technical_500_response
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
from day10.settings import BLACKLIST
# ⾃定义中间件
class MyMiddleware(MiddlewareMixin):
def process_request(self,request):
print(request.META['REMOTE_ADDR'])
# ⽹站统计
#⿊名单
# if request.META['REMOTE_ADDR'] in BLACKLIST:
# return HttpResponse("本站不欢迎你")
#登录判断
# username = request.session.get('username')
# path = request.path #请求路径
# print(username,path)
# if not username and path != '/app/login/':
# return redirect(reverse("app:login"))
# 统⼀返回json数据
def process_response(self,request,response):
print("response")
#类型判断
if isinstance(response,(dict,list)):
result = json.dumps(response)
# 必须返回数据
return HttpResponse(result)
return response
def process_exception(self,request,exception):
# 对管理员展示错误⻚⾯,⼀般⽤户只能看到404,500等⻚⾯
ip = request.META.get('REMOTE_ADDR')
if ip == '127.0.0.1':
return
technical_500_response(request,*sys.exc_info())
return redirect(reverse("app:index"))
启⽤中间件
在settings中进⾏配置,MIDDLEWARE中添加:模块名.middleware.类名
MIDDLEWARE = [
.......
'App.middleware.MyMiddle1',
]