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

时间:2013-04-19 15:04:52

标签: django request django-users userinfo django-login

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

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

  • 首先创建一个新应用,即。 startapp request_middleware
  • 然后将"request_middleware"添加到INSTALLED_APPS中的settings.py
  • 之后粘贴代码,即。 request_middleware.middleware.py
  • 最后将"request_middleware.middleware.RequestMiddleware"添加到MIDDLEWARE中的settings.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

之后,只需执行from request_middlware.middleware import get_request即可在代码中使用get_request