在Django中获取当前用户登录信号

Dja*_*nux 13 django django-admin django-users

我只是在Django中使用管理站点.我有2个Django信号(pre_save和post_save).我想拥有当前用户的用户名.我该怎么办?它似乎不能发送请求或我不理解它.

谢谢

Gre*_*all 21

由于不愿意解决线程本地状态,我决定尝试不同的方法.据我所知,post_savepre_save调用处理程序在调用的线程中同步调用save().如果我们处于正常的请求处理循环中,那么我们可以沿着堆栈向上查找请求对象作为局部变量.例如

from django.db.models.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save)
def my_callback(sender, **kwargs):
    import inspect
    for frame_record in inspect.stack():
        if frame_record[3]=='get_response':
            request = frame_record[0].f_locals['request']
            break
    else:
        request = None
    ...
Run Code Online (Sandbox Code Playgroud)

如果有当前请求,您可以从中获取user属性.

注意:就像它在inspect模块文档中所说的那样,

此函数依赖于解释器中的Python堆栈帧支持,但不保证在Python的所有实现中都存在这种支持.

  • 先生,你是个传奇。出色的解决方案,正如宣传的那样工作。 (4认同)
  • **优点** - 工作,更简单实现并避免线程本地(可能是也可能不是坏事)**缺点** - 性能损失(必须为每个信号扫描调用堆栈),不会通过测试工作 - 您需要添加额外的逻辑来从测试中提取请求对象 (3认同)

Dav*_*anc 10

如果您使用的是管理网站,为什么不使用自定义模型管理员

class MyModelAdmin( admin.ModelAdmin ):
    def save_model( self, request, obj, form, change ):
        #pre save stuff here
        obj.save()
        #post save stuff here



admin.site.register( MyModel, MyModelAdmin )
Run Code Online (Sandbox Code Playgroud)

每次保存对象时都会触发信号,无论是由管理员执行还是某些与请求无关的进程完成,并且实际上不是执行基于请求的操作的合适位置