• Django中间件


    中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

    中间件一个面向对象的类,当中包含五个公共方法

    Process_request 在请求后,process_views之前,执行views函数之前执行的方法

    Process_views 在请求Process_request后,执行views函数之前执行的方法

    Views 视图

    Process_exception 视图处理之后,响应响应之前之前

    Process_template_response  process_exception之后渲染模板之前

    Process_response 返回response之前

     在项目主目录下创建middleware.py 文件

    代码如下

    from django.utils.deprecation import MiddlewareMixin
    from django.http import HttpResponse
    from Qshop.settings import ERROR_PATH
    import time
    
    
    class MiddleWareTest(MiddlewareMixin):
    
    
        def process_request(self,request):
            ip = request.META.get("REMOTE_ADDR")
            print("我是process_request")
            if ip == "10.10.14.167":
                return HttpResponse("<h1>非法ip</h1>")
    
    
    
        def process_view(self,request,callback,callback_args,callback_kwargs):
            """
            :param request:请求
            :param callback: 对应视图函数,访问那个视图就是那个视图
            :param callback_args: 视图函数对应的参数 元组类型
            :param callback_kwargs: 视图函数的参数, 字典类型
            :return:
            """
            print("我是process_view")
            print(callback)
    
        def process_exception(self,request,exception):
            """
            出现异常执行
            :param excetion:
            :return:
            """
            if exception:
                with open(ERROR_PATH,"a") as f:
                    now = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
                    content = "[%s]:%s
    "%(now,exception)
                    f.write(content)
                    # 发送邮件
                return HttpResponse("代码出错了%s"%exception)
    
    
        def process_template_response(self,request,response):
            """
            必须返回一个render才可以触发
            :param request:
            :param response:
            :return:
            """
            print("我是process_template_response")
            return HttpResponse("123")
    
    
        def process_response(self,request,response):
            """
            process_response 和 process_template_response必须有返回值
            :param request:
            :param response:
            :return:
            """
            print("process_response")
            return response

     process_template_process   必须有返回值   必须对象中要有render方法

     settings配置

    views.py

    # def middle_test_view(request):
    #     print("我是view")
    #     return JsonResponse({"data":"hello"})
    
    # 用来测试process_template_response
    def middle_test_view(request):
        def hello():
           return HttpResponse("hello world")
        rep = HttpResponse("nihao")
        rep.render = hello
        return rep
  • 相关阅读:
    Linux进程间通信:父子进程通过信号通信,实现交替数数,时间间隔1秒
    Ubuntu18 给terminal改个漂亮的命令行提示符
    int型、char*、string、的swap算法
    C++中的友元函数的总结
    C++内联函数
    static作用,静态成员变量和静态成员函数
    9——对象的创建和撤销,构造函数和析构函数
    如何用敏捷搞垮一个团队?
    .Net核心中间件httpContext不支持并发读写 Concurrent reads or writes are not supported.
    CentOS 7 MySQL5.7 多实例(多端口)
  • 原文地址:https://www.cnblogs.com/songdanlee/p/11546110.html
Copyright © 2020-2023  润新知