Django:如何在视图请求之外获取登录用户?

Cod*_*ist 2 django request userinfo django-users django-login

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

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

提前致谢。

小智 5

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

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

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

2017 年 7 月更新:使用 Python 3.6.1 和 Django 1.10.7 进行测试,基于此答案中的原始代码和编写您自己的中间件文档。

  • 首先创建一个新的应用程序,即。startapp request_middleware.
  • 然后添加"request_middleware"到您的INSTALLED_APPSin 中settings.py
  • 之后粘贴下面的代码,即。request_middleware.middleware.py.
  • 最后添加"request_middleware.middleware.RequestMiddleware"到您的输入MIDDLEWAREsettings.py(在我的情况下,我已将它放在列表之间'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
Run Code Online (Sandbox Code Playgroud)

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

  • @SalchiPapa这个解决方案是线程安全的吗?我可以在“post_save”模型信号中使用“get_request”吗? (2认同)