【问题标题】:Access request.session from backend.get_user从 backend.get_user 访问 request.session
【发布时间】:2010-11-08 15:52:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: django authentication session request


    【解决方案1】:

    RemoteUserBackend(来自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】:

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

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

    【讨论】:

    • 问题是get_user函数,没有authenticate(..)
    • 我仍然发现答案很有用,因为我在身份验证期间需要它。
    【解决方案3】:

    您可以使用小号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',
        ...
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2018-10-24
      • 2022-06-16
      相关资源
      最近更新 更多