【问题标题】:After adding a permission, why do I need to re-query for the Django user to see the added permission?添加权限后,为什么需要重新查询Django用户才能看到添加的权限?
【发布时间】:2013-03-16 00:25:21
【问题描述】:

在下面的Django manage.py shell 会话中,为什么我在为该用户执行新查询之前看不到我添加到用户对象的权限?

In [16]: john = User.objects.create_user(username='john')

In [17]: john
Out[17]: <User: john>

In [18]: john.get_all_permissions()
Out[18]: set([])

In [19]: john.user_permissions.add(Permission.objects.get(codename='add_user'))

In [20]: john.get_all_permissions()
Out[20]: set([])   <== I expected to see the new permission here.  Why not?

In [21]: john = User.objects.get(username='john')

In [22]: john.get_all_permissions()
Out[22]: set([u'auth.add_user'])

【问题讨论】:

    标签: django permissions


    【解决方案1】:

    Django 会在您第一次为给定用户实例请求权限时缓存它们,它会将它们存储在用户对象上的 _perm_cache 上,这是为了防止在检查可能在请求期间多次发生的权限时进行过多的数据库查找(尤其是在模板渲染期间,您可能需要对表单和链接进行权限检查)。

    您已经确定了一种解决问题的方法,即从数据库中重新加载用户。另一种是从用户对象中删除_perm_cache(如果你想彻底删除_group_perm_cache):

    del john._perm_cache
    del john._group_perm_cache
    

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2020-01-21
      • 2018-08-31
      • 1970-01-01
      • 2013-12-29
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多