首页 > 其他 > 详细

Django中间件

时间:2019-09-18 23:48:33      阅读:96      评论:0      收藏:0      [点我收藏+]

中间件顾名思义,是介于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\n"%(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

 

Django中间件

原文:https://www.cnblogs.com/songdanlee/p/11546110.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!