在post-save标志中访问用户的请求

2024-06-02 06:31:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在我的项目中完成了下面的post_save信号。

from django.db.models.signals import post_save
from django.contrib.auth.models import User

# CORE - SIGNALS
# Core Signals will operate based on post

def after_save_handler_attr_audit_obj(sender, **kwargs):
    print User.get_profile()

    if hasattr(kwargs['instance'], 'audit_obj'):
        if kwargs['created']:
            kwargs['instance'].audit_obj.create(operation="INSERT", operation_by=**USER.ID**).save()
        else:
            kwargs['instance'].audit_obj.create(operation="UPDATE").save()


# Connect the handler with the post save signal - Django 1.2
post_save.connect(after_save_handler_attr_audit_obj, dispatch_uid="core.models.audit.new")

按列操作,我要获取用户id并将其存储。知道怎么做吗?


Tags: djangoinstancefromimportobjmodelssaveaudit
3条回答

我可以通过检查堆栈并查找视图,然后查看视图的局部变量来获取请求。感觉有点像黑客,但很管用。

import inspect, os

@receiver(post_save, sender=MyModel)
def get_user_in_signal(sender, **kwargs):
    for entry in reversed(inspect.stack()):
        if os.path.dirname(__file__) + '/views.py' == entry[1]:
            try:
                user = entry[0].f_locals['request'].user
            except:
                user = None
            break
    if user:
        # do stuff with the user variable

做不到。当前用户仅通过请求可用,而在使用纯模型功能时不可用。以某种方式访问视图中的用户。

伊格纳西奥是对的。Django的模型信号旨在通知其他系统组件与实例相关的事件及其相关数据,因此我猜您不能从模型post_save信号访问请求数据是有效的,除非该请求数据存储在实例上或与实例相关。

我想有很多方法可以处理它,从坏到好,但我想这是一个prime示例,用于创建基于类/基于函数的通用视图,它将自动为您处理这个问题。

让您的视图继承自CreateViewUpdateViewDeleteView如果它们处理在需要审核的模型上操作的谓词,则另外继承自AuditMixin类。然后AuditMixin可以挂接到成功创建\update\delete对象并在数据库中创建条目的视图中。

非常有意义,非常干净,容易插拔,并产生快乐的小马。反面?您要么必须在即将发布的Django 1.3版本上,要么必须花一些时间修改基于函数的通用视图,并为每个审核操作提供新视图。

相关问题 更多 >