从backend.get_user访问request.session

时间:2009-07-07 10:38:57

标签: django authentication session request

首先: this相同。 ModelBackend没有request成员。

我想访问当前用户的会话而无法访问全局请求对象或他/她的会话ID。

为什么呢?我编写了自己的身份验证后端,扩展了ModelBackend。因为我有函数get_user (self, user_id),每次请求都会调用它(这是由Django auth中间件自动完成的)。不幸的是,get_user无权访问request,但在我的情况下,我想检查会话中的数据(为什么又一次?因为我没有本地数据库并获取所有数据来自远程中间件。会话将是一种舒适的方式来进行某种缓存。)

3 个答案:

答案 0 :(得分:6)

您可以使用微小的ThreadLocalMiddleware。它使请求对象随处可用。

from django_tools.middlewares import ThreadLocal

request = ThreadLocal.get_current_request()
# request.session <-- is now available

不要忘记将中间件添加到settings.py的MIDDLEWARE_CLASSES元组中:

MIDDLEWARE_CLASSES = (
    ...
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware',
    ...
)

答案 1 :(得分:4)

RemoteUserBackend(来自django.contrib.auth.backends)使用特殊中间件RemoteUserMiddleware来访问请求数据。也许你也可以这样做。

答案 2 :(得分:0)

您也可以在任何时候将“请求”参数传递给authenticate函数:

def authenticate(self, request, **kwargs):
    ....