在Redis中缓存经过身份验证的用户?

时间:2015-09-06 19:01:21

标签: django django-authentication django-cache

我的Django应用程序中几乎所有页面都需要身份验证。该应用程序使用Django的AuthenticationMiddleware,因此每次请求时,应用程序都会访问数据库以检索经过身份验证的用户。

我最近开始在Redis支持的缓存中存储会话数据。由于这一点很好,通过从缓存中获取会话数据来消除每个请求的一个数据库查询,我想知道我是否也可以在Redis中存储经过身份验证的用户?

我正在考虑使用自定义authentication backend来实现此功能,这只会将Django的ModelBackend作为子类,从而覆盖get_user()方法:

# backends.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

class MyAuthBackend(ModelBackend):

    def get_user(self, user_id):
        user = get_user_from_cache(user_id)  # not implemented here
        if user is None:
            UserModel = get_user_model()
            try:
                user = UserModel._default_manager.get(pk=user_id)
            except UserModel.DoesNotExist:
                return None
            else:
                set_user_in_cache(user)  # not implemented here
                return user

在设置中挂钩:

# settings.py
AUTHENTICATION_BACKENDS = ('myapp.backends.MyAuthBackend',)

我也应该注意:

我可能不打算缓存整个用户对象。相反,这可能只是缓存一个基本字典,该字典仅包含应用程序在每个页面上所需的用户信息(如user_id,name等)。因此,Django的AuthenticationMiddleware添加到每个传入的user对象的request属性将不是我的用户模型的实例。

这是个好主意吗?有什么缺点吗?而且,如果可以,这是实现这一目标的首选方式吗?

非常感谢!

更新

我已经在Redis中成功缓存了一段时间的用户数据。但是,我没有像我最初计划和在问题中描述的那样创建自定义身份验证后端,而是完全取代了django' AuthenticationMiddleware

灵感来自this package,我的实施非常相似。

1 个答案:

答案 0 :(得分:0)

缓存用户是非常常见的,没有错。我认为比你更简单,更好的方法是使用缓存机器(https://cache-machine.readthedocs.org/en/latest/)之类的东西,它也会在必要时处理缓存失效。作为奖励点,您还可以在堆栈中添加一些内容,以便缓存其他常见查询模型。