zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    android编译时出现org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugJavaWithJavac'.错误
    jdk1.8中获取项目绝对路径和项目路径
    okhttp在https连接中出现java.net.ProtocolException: Expected ':status' header not present的解决办法
    mybatis+sqlserver中返回非自增主键
    华为手机不能连接android studio进行调试的解决办法
    android中service启动后台程序
    getContentLength() 指为 -1 的解决办法
    svn服务器搭建(windows)
    Caliburn.Micro 杰的入门教程3,事件和参数
    Caliburn.Micro 杰的入门教程1(翻译)
  • 原文地址:https://www.cnblogs.com/songdanlee/p/11546110.html
Copyright © 2011-2022 走看看