处理django用户模型中的权限缓存

Ron*_*Ron 5 python django django-permissions

我偶然发现了一个奇怪的行为:我向用户对象添加了权限,但权限检查失败。

permission = Permission.objects.get_by_natural_key(app_label='myapp', codename='my_codename', model='mymodel')
user.user_permissions.add(permission)

user.has_permission('myapp.my_codename') # this is False!
Run Code Online (Sandbox Code Playgroud)

我在这里这里找到了一些关于用户权限缓存的帖子,解决方案似乎是从数据库完全重新加载对象。

# Request new instance of User
user = get_object_or_404(pk=user_id)

# Now note how the permissions have been updated
user.has_perms('myapp.my_codename') # now it's True
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎太过分了,而且非常不像 django。是否真的没有办法清除权限缓存或重新加载外键,就像您可以对对象执行的那样refresh_from_db()

提前致谢!
罗尼

bdb*_*dbd 6

您可以通过删除用户对象的_perm_cache和来强制重新计算_user_perm_cache

permission = Permission.objects.get_by_natural_key(app_label='myapp', codename='my_codename', model='mymodel')
user.user_permissions.add(permission)
user.has_permission('myapp.my_codename') # returns False

del user._perm_cache
del user._user_perm_cache
user.has_permission('myapp.my_codename') # should be True
Run Code Online (Sandbox Code Playgroud)

但这实际上会再次访问数据库以获取更新的权限。由于这些是基于 django 的内部工作原理,而不是公共 API 的一部分,这些缓存键将来可能会发生变化,所以我仍然建议再次获取用户。但这完全取决于你。