django中间件[Python基础]

python

中间件的应用场景:

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

以上是 django中间件[Python基础] 的全部内容, 来源链接: utcz.com/z/530357.html

回到顶部