Django在Model保存前记录日志

本文介绍如何在Django的Model保存前后使用信号机制来触发特定操作,例如记录日志等。通过使用pre_save信号,可以实现在保存Model实例之前执行自定义函数。

文章转自:https://blog.youkuaiyun.com/qq_37049050/article/details/81746046

Django中如何在Model保存前做一定的固定操作,比如写一句日志?

关键词: 信号

利用Django的Model的Signal Dispatcher, 通过django.db.models.signals.pre_save() 方法,在事件发生前,

发射

触发信号,这一切都被调度中的receiver方法深藏功与名的保存了。

信号的处理一般都写在Model中,举个例子:

import logging
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
 
class Order(models.Model):
    # ...
 
 
logger = logging.getLogger(__name__)
 
@receiver(pre_save, sender=Order)
def pre_save_handler(sender, **kwargs):
    
    # 我们可以在Order这个Model保存之前尽情调戏了:)
    logger.debug("{}".format(sender, **kwargs))
    print 'fuck universe'

这样应该就实现了题中的要求,类似的方法还有比如 pre_init 是在Model实例之前会触发, post_init 在实例之后触发,同理就是 pre_save 和 post_save 了。

Django记录用户登录日志并将其存储到数据库中,可以通过以下方式实现: ### 1. 自定义日志处理器(Handler) 首先需要创建一个自定义的日志处理器 `DBHandler`,继承自 Python 的 `logging.Handler` 类,并重写 `emit` 方法以将日志信息写入数据库。 假设你已经定义了一个名为 `AuditLog` 的模型用于存储日志信息,则可以编写如下代码: ```python import logging from django.utils import timezone from apps.audit.models import AuditLog class DBHandler(logging.Handler): def __init__(self, level=logging.NOTSET): super().__init__(level) def emit(self, record): try: log = AuditLog( account=record.account, account_id=record.account_id, ip=record.remote_addr, operation_key='user_login', operation_content='User logged in successfully', result='success', return_message='Login successful', type='authentication', ctime=timezone.now() ) log.save() except Exception: self.handleError(record) ``` ### 2. 配置日志系统 接下来,在 `settings.py` 文件中配置日志系统,添加自定义的 `DBHandler` 并指定使用该处理器的日志器(logger)。 ```python LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'db_handler': { 'level': 'INFO', 'class': 'path.to.DBHandler', # 替换为你的DBHandler所在模块路径 }, }, 'loggers': { 'user_login_logger': { 'handlers': ['db_handler'], 'level': 'INFO', 'propagate': True, }, }, } ``` ### 3. 在视图中记录登录日志 当用户成功登录后,可以在视图函数或类中获取指定的日志器实例,并调用其 `info` 方法来记录日志。 例如,在用户登录成功后触发日志记录操作: ```python import logging from django.contrib.auth import authenticate, login logger = logging.getLogger('user_login_logger') def user_login_view(request): username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) logger.info('User login successful', extra={ 'account': user.username, 'account_id': user.id, 'remote_addr': request.META.get('REMOTE_ADDR'), }) return redirect('home') else: # 处理登录失败的情况 return render(request, 'login.html', {'error': 'Invalid credentials'}) ``` ### 4. 数据库模型定义 确保你已经在模型中定义了 `AuditLog` 表结构,以便存储日志信息。例如: ```python from django.db import models class AuditLog(models.Model): account = models.CharField(max_length=150) account_id = models.IntegerField() ip = models.GenericIPAddressField() operation_key = models.CharField(max_length=100) operation_content = models.TextField() result = models.CharField(max_length=50) return_message = models.TextField() type = models.CharField(max_length=50) ctime = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'audit_log' ``` 通过以上步骤,可以实现用户登录日志记录并将其存储到数据库中[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值