【发布时间】: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