Django 日志中间件

 想在请求的开始打印每个请求的请求方式,地址,ip,登录用户名。在响应后打印响应码,响应结果,响应时间,并自动换行。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import logging
import time

from django.utils.deprecation import MiddlewareMixin

logger = logging.getLogger(__name__)

"""日志中间件"""


class OpLogs(MiddlewareMixin):
    __exclude_urls = ['index/']  # 定义不需要记录日志的url名单
    
    def __init__(self, *args):
        super().__init__(*args)
        self.start_time = None  # 开始时间
        self.end_time = None  # 响应时间
        self.data = {}  # dict数据
    
    def process_request(self, request):
        """
        绑定request
        """
        
        self.start_time = time.time()  # 开始时间
        
        # 请求IP
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            # 如果有代理,获取真实IP
            re_ip = x_forwarded_for.split(",")[0]
        else:
            re_ip = request.META.get('REMOTE_ADDR')
        
        # 请求方法
        re_method = request.method
        
        path = request.path
        try:
            name = request.user.name
        except AttributeError:
            name = None
    
        self.data.update(
            {'method': re_method,  # 请求方法
             'path': path,  # 请求url
             'ip': re_ip,  # 请求IP
             're_user': name  # 操作人(需修改),网站登录用户
             }
        )
        logger.info(self.data)
    
    def process_response(self, request, response):
        """
        绑定response
        """
        # 请求url在 exclude_urls中,直接return,不打印日志
        for url in self.__exclude_urls:
            if url in self.data.get('path'):
                return response
        
        # 获取响应数据字符串(多用于API, 返回JSON字符串)
        rp_content = response.content.decode()
        self.data['rp_content'] = rp_content
        
        self.data['status_code'] = response.status_code  # 响应码
        
        # 耗时
        self.end_time = time.time()  # 响应时间
        access_time = self.end_time - self.start_time
        self.data['access_time'] = round(access_time * 1000)  # 耗时毫秒/ms
        
        logger.info(str(self.data) + "]\n")
        return response

需要继承MiddlewareMixin类 process_request()每个请求的日志,process_response()响应日志

 然后注册到中间件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值