django 记录日志到数据库

1、导入相应插件
from django.utils.deprecation import MiddlewareMixin

from middlewares.models import OpLogs, AccessTimeOutLogs
2、创建middlewares的app,并创建OpLogs, AccessTimeOutLogs数据模型
class OpLog(MiddlewareMixin):
__exclude_urls = [‘index/’] # 定义不需要记录日志的url名单

def __init__(self, *args):
    super(OpLog, self).__init__(*args)

    self.start_time = None  # 开始时间
    self.end_time = None  # 响应时间

    self.data = {}  # dict数据

def process_request(self, request):
    """
    请求进入
    :param request: 请求对象
    :return:
    """

    self.start_time = time.time()  # 开始时间
    re_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())  # 请求时间(北京)

    # 请求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

    # 请求参数
    re_content = request.GET if re_method == 'GET' else request.POST
    if re_content:
        # 筛选空参数
        re_content = json.dumps(re_content)
    else:
        re_content = None

    self.data.update(
        {
            're_time': re_time,  # 请求时间
            're_url': request.path,  # 请求url
            're_method': re_method,  # 请求方法
            're_ip': re_ip,  # 请求IP
            're_content': re_content,  # 请求参数
            're_user': request.user.username    # 操作人(需修改),网站登录用户
            # 're_user': 'AnonymousUser'  # 匿名操作用户测试
        }
    )

def process_response(self, request, response):
    """
    响应返回
    :param request: 请求对象
    :param response: 响应对象
    :return: response
    """
    # 请求url在 exclude_urls中,直接return,不保存操作日志记录
    for url in self.__exclude_urls:
        if url in self.data.get('re_url'):
            return response

    # 获取响应数据字符串(多用于API, 返回JSON字符串)
    rp_content = response.content.decode()
    self.data['rp_content'] = rp_content

    # 耗时
    self.end_time = time.time()  # 响应时间
    access_time = self.end_time - self.start_time
    self.data['access_time'] = round(access_time * 1000)  # 耗时毫秒/ms

    # 耗时大于3s的请求,单独记录 (可将时间阈值设置在settings中,实现可配置化)
    if self.data.get('access_time') > 3 * 1000:
        AccessTimeOutLogs.objects.create(**self.data)  # 超时操作日志入库db
    # print(self.data)

    OpLogs.objects.create(**self.data)  # 操作日志入库db

    return response

3、在setting中引用 middlewares
INSTALLED_APPS = [
‘simpleui’,
‘import_export’,
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘middlewares’,
‘Manpage’,
]

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值