django 中间件记录所有请求及请求执行时间

本文详细介绍了Django中间件的工作原理及使用注意事项,包括中间件的执行顺序、多线程并发处理、请求重定向等问题,并提供了LoggingMiddleware的具体实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class LoggingMiddleware(object):
    def process_request(self, request):
        request.start_time = time.time()

    def process_response(self, request, response):
        execute_time = time.time() - request.start_time
        path = request.get_full_path()
        info_logger.info('request %s execute_time %f' % (path, execute_time))
        return response
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'mobile.middlewares.LoggingMiddleware',
)

1 中间件可以保证  process_request  和 process_response 方法不会多线程并发, 所以 2 个方法中的 request 肯定是同一个 request

2 方法中不要引用全局变量或当前类中的变量,否则在多线程并发或协程中会有问题

3 process_request 按顺序从上往下执行, process_response 会反过来从下往上执行

4 如果你的 urlconf 中末尾带反斜线 / , 当链接中不带反斜线时,CommonMiddleware 会把请求重定向到带反斜线的 url

5 这里有一个坑, 当 CommonMiddleware 中请求被从定向时, 后面所有中间件的 process_request 都不会被执行,  但所有中间件的 process_response 还是会反过来执行,

这种情况下上面的 LoggingMiddleware process_response 方法 就会报异常,因为没有 request.start_time

6 解决方法,把两个中间件换一下位置, 但这样会多记录一个不带反斜线的请求(不带反斜线的请求不存在), 还有就是把链接中所有请求都加上反斜线,但由于历史原因

可能有时也加不全。

 

转载于:https://www.cnblogs.com/lesliefang/p/4691446.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值