django--中间件[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

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » django–中间件