django中print打印失败_Django的中间件之一

f363dab02b459ace0c53e9a6caf43ce8.png

分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件.

假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢?

Django的中间件的简介

Django的中间件类似于linux中的管道符

Django的中间件实质就是一个类,类之中有Django已经定义好了一些方法.

每个http请求都会执行中间件中的一个或多个方法

进入Django中的请求都会执行process_request方法;
Django返回的信息都会执行process_response方法.;

Django内部的中间件注册在settings.py文件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

导入from django.middleware.csrf import CsrfViewMiddleware模块,查看其源码

class CsrfViewMiddleware(MiddlewareMixin)

可以看到CsrfViewMiddleware是继承MiddlewareMixin这个中间件的

再查看MiddlewareMixin的源码

    class MiddlewareMixin(object):
        def __init__(self, get_response=None):
            self.get_response = get_response
            super(MiddlewareMixin, self).__init__()
    
        def __call__(self, request):
            response = None
            if hasattr(self, 'process_request'):
                response = self.process_request(request)
            if not response:
                response = self.get_response(request)
            if hasattr(self, 'process_response'):
                response = self.process_response(request, response)
            return response

可以知道MiddlewareMixin是调用了其内部的__call__方法,__call__方法以反射的方式执行process_request和process_response方法.

中间件的应用

新建一个middleware项目,在项目的根目录中新建一个名为middleware的包,在这个package中,新建一个middleware.py文件.

    from django.utils.deprecation import MiddlewareMixin
    
    class middle_ware1(MiddlewareMixin):
    
        def process_request(self,request):
            print("middle_ware1.process_request")
    
        def process_response(self,request,response):
            print("middle_ware1.process_response")
            return response

在settings.py配置文件的第一行注册这个中间件

MIDDLEWARE = [
    'middleware.middleware.middle_ware1'
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

现在如果有http请求到达服务端,先执行中间件middle_ware1的process_request方法,再执行后面的中间件,然后到达视图函数.

定义一个视图函数index,配置好路由映射表

def index(request):
 
    print("index page")
    return HttpResponse("index")

启动程序,在浏览器中输入http://127.0.0.1:8000/index,会在服务端的后台打印:

middle_ware1.process_request
index page
middle_ware1.process_response

前端的页面为显示为:

index

通过这个我们知道,所有的请求都会经过middle_ware1这个中间件,先执行process_request方法,再执行视图函数本身

最后执行process_response方法,Django会把process_response方法的返回值返回给客户端.

现在再加一个定义一个middle_ware2的中间件

    from django.utils.deprecation import MiddlewareMixin
    
    class middle_ware2(MiddlewareMixin):
    
        def process_request(self,request):
            print("middle_ware2.process_request")
    
        def process_response(self,request,response):
            print("middle_ware2.process_response")
            return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值