从 backend.get_user 访问 request.session
Posted
技术标签:
【中文标题】从 backend.get_user 访问 request.session【英文标题】:Access request.session from backend.get_user 【发布时间】:2010-11-08 15:52:12 【问题描述】:首先:这不与this 相同。 ModelBackend 没有request
成员。
我想访问当前用户的会话而不访问全局请求对象或他/她的会话 ID。
为什么?我编写了自己的身份验证后端,扩展了ModelBackend
。我有函数get_user (self, user_id)
,每个请求都会调用它(这是由Django auth 中间件自动完成的)。不幸的是,get_user
无权访问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',
...
)
【讨论】:
以上是关于从 backend.get_user 访问 request.session的主要内容,如果未能解决你的问题,请参考以下文章
如何从 socket.io 中访问 req.session 变量?
express-jwt 无法从路由目录访问 req.user