Django:如何在查看请求之外获取已登录的用户?

Posted

技术标签:

【中文标题】Django:如何在查看请求之外获取已登录的用户?【英文标题】:Django: How can i get the logged user outside of view request? 【发布时间】:2013-04-19 15:04:52 【问题描述】:

我有一个需要登录用户信息的类方法(在视图之外)。如何在不将 request 传递给方法的情况下检索登录用户?不幸的是,我找不到一个好的解决方案,而且不存在这样的方法是不合逻辑的,因为 Django 应该将登录用户存储在某个地方。否则(我相信)不可能使用来自django.contrib.auth.decorators@login_required 装饰器。对吧?

如果不可能,为什么不呢?如果我唯一想要的是登录用户而不是 request 中的所有信息,为什么 Django 会这样工作?

提前致谢。

【问题讨论】:

【参考方案1】:

关于装饰器,这是错误的。实际上是使用请求参数调用的装饰器。

我相信更好的方法是将用户或请求对象传递给类的方法。但是还有其他方法可以访问请求。

这是我们使用的代码。您需要将此中间件添加到 MIDDLEWARES。并导入并调用 get_request 函数。

2017 年 7 月更新:使用 Python 3.6.1 和 Django 1.10.7 测试,基于此答案的原始代码和 Writing your own middleware 文档。

首先创建一个新的应用程序,即。 startapp request_middleware。 然后在settings.py 中将"request_middleware" 添加到您的INSTALLED_APPS。 然后粘贴下面的代码,即。 request_middleware.middleware.py。 最后将"request_middleware.middleware.RequestMiddleware" 添加到settings.py 中的MIDDLEWARE(在我的情况下,我将它放在'debug_toolbar.middleware.DebugToolbarMiddleware''django.middleware.security.SecurityMiddleware' 之间,尽我所能)。
# request_middleware.middleware.py

from threading import current_thread

_REQUESTS = 


class RequestNotFound(Exception):
    def __init__(self, message):
        self.message = message


def get_request():
    thread = current_thread()
    if thread not in _REQUESTS:
        raise RequestNotFound('global request error')
    else:
        return _REQUESTS[thread]


class RequestMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def process_request(self, request):
        _REQUESTS[current_thread()] = request

    def __call__(self, request):
        self.process_request(request)
        response = self.get_response(request)

        return response

之后只需执行from request_middleware.middleware import get_request 即可在您的代码中使用get_request

【讨论】:

我刚刚找到了一个repo github.com/tzulberti/django-request-provider,但我没有测试它。 感谢您的回答。现在很好,但我真的很想知道为什么 Django 会这样工作?我的意思是为什么没有其他方法可以获取登录用户?我不需要请求中包含的所有信息... @SalchiPapa 这个解决方案是线程安全的吗?我可以在post_save 模型信号中使用get_request 吗?

以上是关于Django:如何在查看请求之外获取已登录的用户?的主要内容,如果未能解决你的问题,请参考以下文章

Django之auth模块(用户认证)登陆组件

如何在不登录 jwt django rest-framework 的情况下获取请求数据

在Django中获取当前用户登录信号

要获取无效的凭证,甚至凭证都以Django登录格式在数据库中注册?

在 django 模板中获取用户信息

在 django 模板中获取用户信息