从backend.get_user访问request.session

Bol*_*wyn 12 authentication django session request

首先:这与一样.ModelBackend没有会员.request

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

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

Jer*_*emi 6

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

from django_tools.middlewares import ThreadLocal

request = ThreadLocal.get_current_request()
# request.session <-- is now available
Run Code Online (Sandbox Code Playgroud)

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

MIDDLEWARE_CLASSES = (
    ...
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware',
    ...
)
Run Code Online (Sandbox Code Playgroud)


drd*_*man 4

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

  • @RonSmith 我已经更新了一些链接。诀窍在于,一切都是由“RemoteUserMiddleware.process_request”完成的 - 它传递一个“request”对象(middleware.py#L40)。它检查是否存在“Remote-User”HTTP 标头(L50),如果存在,则将该数据传递到“RemoteUserBackend.authenticate”(L73)并将结果保存在“request”(L77)中。在这种情况下,HTTP 标头的唯一值是 passeb,但想法是,如果您需要身份验证后端中的会话信息,您可以先从中间件将其存储在那里。 (2认同)
  • 您介意用几行代码作为示例来更新您的答案吗?谢谢。 (2认同)