django–中间件
中间件的应用场景:
1, 做ip访问频率限制: 某些ip访问服务器的频率过高,进行拦截, 比如每分钟不能超过20次
2, url访问过滤: 如果用户访问的是login(登录)或者register(注册)之类的就放过,
如果访问其他视图, 需要检测是不是有session认证, 已经有了就放行,
没有就返回login, 这样就省得在多个视图函数上写装饰器了
流程
中间件: 1,先走所有的process_request,
2,再找url,
3,再走所有的process_view,
4, 再继续执行url对应的视图函数
5, 如果执行url对应的视图函数出错, 就执行中间件process_exception(反方向执行)
4, 再走所有的process_response(反方向执行)
### 如何使用中间件
对所有请求和响应做一些统一处理
自定义中间件的流程
1, 在应用中创建一个py文件, 比如mymiddleware.py
2, 文件中书写内容如下, 先要引入模块
from django.shortcuts import redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
# 登录认证中间件
class loginAuth(MiddlewareMixin):
# 白名单
white_list = ["/login/","register"]
# 对请求处理用process_request, 如果请求通过了处理, 就return None(就是可以继续往下执行), 如果没有通过直接return Httpresponse对象, 可以直接返回
def process_request(self,request):
current_path = request.path # 可以直接获取到用户请求的路径
# 判断用户请求路径是否在白名单中,
if current_path not in self.white_list:
status = request.session.get("is_login") # 获取到session值
if not status: # 判断, 如果没有session值, 就给他字符串提示,或者重定向去登录
# return HttpResponse("去登录吧")
return redirect("login")
print("请求正常通行")# 如果获取到session, 就给用户请求的路径通行
class Md1(MiddlewareMixin):
def process_request(self,request):
print("Md1-process_request")
# return HttpResponse("ojbk") #process_requestzhong中如果returnhttpresponse对象, 那么中间件执行到这里直接返回
def process_response(self,request,response):
print(response)#<HttpResponse status_code=200, "text/html; charset=utf-8">
print("Md1-process_request")
# 获取到httpresponse的最终返回值或者html文件(都是字节流类型), 可以decode成字符串, 如果是html页面, 则会展示html代码
print(response.content.decode())
response["xx"] = "oo"
# return HttpResponse("ok") # 如果return是HTTPResponse对象, 那么替换视图函数中的返回值
return response #注意 使用process_response一定要return response, 否则报错
def process_view(self,request,view_func,view_args,view_kwargs):
print("Md1-process_view")
print(view_func, view_args,view_kwargs)
print("Md1-process_view2")
def process_exception(self,request,exception):
print("Md1-process_exception")
print(exception, type(exception))# 收集到报错信息, 可以做处理, 预防服务器故障
# 统一做异常处理
if isinstance(exception,ValueError):
return HttpResponse("有函数报错了,请及时处理",status=500)
class Md2(MiddlewareMixin):
def process_request(self,request):
print("Md2-procss_request")
def process_response(self,quest,response):
print("Md2-process_response")
return response
def process_view(self,request,view_func,view_args,view_kwargs):
print("Md2-process_view")
def process_exception(self,request,exception):
print("Md2-process_exception")
# 还有一个中间件, 很少用到
def process_template_response(self,request,response):
pass