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()?
提前致谢!
罗尼
您可以通过删除用户对象的_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 的一部分,这些缓存键将来可能会发生变化,所以我仍然建议再次获取用户。但这完全取决于你。
| 归档时间: |
|
| 查看次数: |
1665 次 |
| 最近记录: |