如何预取django用户组以进行权限检查

时间:2017-10-26 22:58:57

标签: django python-3.x django-models django-rest-framework

我有一个经过反复检查权限的类。每次从数据库中重新查询请求用户的组而不是缓存它们使得事情变得非常缓慢。如何在请求用户中预取或缓存组?

class Object(models.Model):
    ...
    def has_object_read_permission(self, request):
        if ('test' not in request.user.groups.all()):
             return False
        return True

2 个答案:

答案 0 :(得分:1)

我认为优化此方法的最佳方法是使用redis或memcached等缓存。

我已成功使用django-cacheops进行数据库查询缓存。只需一点点配置即可完美无缝地工作。

如果您查看setup部分,您会注意到您可以在设置中定位特定模型以进行缓存:

CACHEOPS_DEFAULTS = {
    'timeout': 60*60
}
CACHEOPS = {
    'auth.user': {'ops': 'get', 'timeout': 60*15},
    'auth.*': {'ops': ('fetch', 'get')},
    'auth.permission': {'ops': 'all'},
    '*.*': {},
}

通过这种方式,您可以先缓存用户和群组查询,然后根据需要优化其他模型。

答案 1 :(得分:0)

我最终在这个答案中使用了配置文件缓存方法。

How to cache user.groups in a request so db isn't hit every time you call request.user.groups.all()?

这里是代码,有一个错误修复添加"不是"到if语句

class User(...):
    @property
    def cached_groups(self):
        if not hasattr(self, '_cached_groups'):
            self._cached_groups = list(self.groups.all())
        return self._cached_groups