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
  • 相关阅读:
    【转】IBatis.Net项目数据库SqlServer迁移至Oracle
    【转】远程桌面 剪切板复制文件失效解决方法
    为什么越学反而越蠢?碎片化学习是个骗局
    Spring MVC起步
    [1-1] 把时间当做朋友(李笑来)Chapter 1 【心智的力量】 摘录
    Java反射总结
    No enclosing instance of type Demo is accessible. Must qualify the allocation with an enclosing instance of type Demo (e.g. x.new A() where x is an instance of Demo).
    hiberbnate 缓存策略概述
    一分钟看你缺乏哪种维生素
    zrrx笔试题(一)——文件复制&日期天数差
  • 原文地址:https://www.cnblogs.com/songdanlee/p/11546110.html
Copyright © 2011-2022 走看看