监视组和权限更改的Django信号处理程序?

Posted

技术标签:

【中文标题】监视组和权限更改的Django信号处理程序?【英文标题】:Django signal handler that monitors changes to groups & permissions? 【发布时间】:2011-09-11 08:25:46 【问题描述】:

我想在 User 模型上注册一个信号处理程序,如下所示:

def post_save_handler(sender, instance, created, **kwargs): 
    should_have_profile = instance.has_perm('profile.should_have')

    if should_have_profile: 
        profile, created = Profile.objects.get_or_create(user=instance)
        if crated: 
            profile.save() 
    else: 
        old_profile = Profile.objects.filter(user=instance)
        if old_profile: 
            old_profile.delete() 

但是,在信号处理程序中,对新权限(通过更改组成员身份在视图代码中添加或删除)的“has_perm”测试没有正确进入。好像还没有应用新组。

我曾一度怀疑 contrib.auth.backends.py 中的 _group_perm_cache_perm_cache,但我增强了我的信号处理程序以从传入实例中删除这些值,结果是相同的。

我只能推测,对当前组的任何更改都不会传递给该用户。为此,我还尝试在 User 对象上注册 m2m_changed 侦听器,但这也没有被调用(可能是因为 User.groups 没有实现为 ManyToManyField)。

有什么方法可以正确地做我想做的事吗?

【问题讨论】:

【参考方案1】:

m2m_changed 包含一个参数,该参数告诉更改发生在关系的哪一侧,因此这意味着它将双向工作。组是 M2M,但 ManyToManyField 位于 Group 模型上,而不是 User 模型上。如果您在connect 方法中传递sender,则它实际上应该是Group,因为这是ManyToManyField 所在的位置。对此不确定,但这是我唯一能想到的为什么您的m2m_changed 信号不会被发送。

【讨论】:

以上是关于监视组和权限更改的Django信号处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

切换到 Django 自定义用户模型、组和权限

信号量,互斥,监视器之间的区别实现了同步

Django 1.6 - 以编程方式创建组和权限

Django中的信号

Django中的信号

Django中的信号