【问题标题】:Caching authenticated users in Redis?在 Redis 中缓存经过身份验证的用户?
【发布时间】:2015-09-06 19:01:20
【问题描述】:

我的 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 添加到每个传入的 request 对象的 user 属性将不是我的用户模型的实例。

这是个好主意吗?有什么缺点吗?而且,如果可以的话,这是完成此任务的首选方式吗?

非常感谢!

更新:

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

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

【问题讨论】:

    标签: django django-authentication django-cache


    【解决方案1】:

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

    【讨论】:

    • 嘿,谢谢——太好了,很高兴知道它很常见,这真的很有帮助!我不介意手动失效,我希望完全控制进入缓存的数据。
    猜你喜欢
    • 2015-06-21
    • 2020-11-04
    • 2012-07-24
    • 1970-01-01
    • 2017-03-02
    • 2020-11-15
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多