django记录基础操作日志
1. 新增middleware.py中间件: 需要在setting.py注册
class LoggingMiddleware: """ 日志记录模块: 操作用户、操作ip、请求路径、请求方式、请求时间 """ def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if forwarded_for: # 以逗号为分隔符,获取最后一个IP地址 request.internal_ip = forwarded_for.split(',')[-1].strip() else: request.internal_ip = request.META.get('REMOTE_ADDR') if not request.path.startswith("/v5/account/login/") and not request.user.is_authenticated \ or request.method not in ['POST', 'PUT', 'PATCH', 'DELETE']: return response print("request.user: ", request.user) print("request.path: ", request.path) print("request.method: ", request.method) print("request.ip: ", request.internal_ip) print("status_code: ", response.status_code) return response
2. 新增model.py
class LogModel(BaseModel): """系统操作日志记录""" request_user = models.CharField(max_length=32, blank=True, verbose_name="请求用户") request_path = models.CharField(max_length=128, blank=True, verbose_name="请求路径") request_method = models.CharField(max_length=8, blank=True, verbose_name="请求方式") request_ip = models.CharField(max_length=32, blank=True, verbose_name="请求ip") response_code = models.CharField(max_length=8, blank=True, verbose_name="响应码") class Meta: verbose_name = "系统操作日志" verbose_name_plural = verbose_name
还有基于信号实现的(监听某张表的操作)
还有基于django-simple-history的操作。但是这种操作会额外新增一张表(比如你原本有100张表。使用了这个插件会额外生成100张。总共就是200张)
第一种方式最为简洁。代码量更少。可维护性更高(也可以将ContentType表添加进去)
contenttype配置示例
models配置示例
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class RechargePackage(BaseModel): """ 充值描述 """ total_fee = models.BigIntegerField(verbose_name="订单的资金总额,单位为分") count = models.BigIntegerField(verbose_name='充值次数') description = models.CharField(max_length=256, verbose_name="商品描述") shopping_car_list = GenericRelation("ShoppingCar") class ShoppingCar(BaseModel): product_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING, related_name='product_order_list') product_id = models.CharField(max_length=32) product = GenericForeignKey('product_type', 'product_id') count = models.IntegerField(verbose_name='数量')
本文来自博客园,作者:一石数字欠我15w!!!,转载请注明原文链接:https://www.cnblogs.com/52-qq/p/17296274.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2018-04-07 Django项目开发-小技巧
2018-04-07 前端验证后端验证码问题