django中间件

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',
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值