我有一个需要登录用户信息的类方法(在视图之外)。如何在不将请求传递给方法的情况下检索登录用户?不幸的是,我找不到一个好的解决方案,而且不存在这样的方法是不合逻辑的,因为 Django 应该将登录用户存储在某个地方。否则(我相信)不可能使用@login_required
来自django.contrib.auth.decorators
. 正确的?
所以如果不可能,为什么不呢?如果我唯一想要的是登录用户而不是里面的所有信息,为什么 Django 会这样工作request
?
提前致谢。
我有一个需要登录用户信息的类方法(在视图之外)。如何在不将请求传递给方法的情况下检索登录用户?不幸的是,我找不到一个好的解决方案,而且不存在这样的方法是不合逻辑的,因为 Django 应该将登录用户存储在某个地方。否则(我相信)不可能使用@login_required
来自django.contrib.auth.decorators
. 正确的?
所以如果不可能,为什么不呢?如果我唯一想要的是登录用户而不是里面的所有信息,为什么 Django 会这样工作request
?
提前致谢。
关于装饰器,这是错误的。实际上使用请求参数调用的装饰器。
我相信更好的方法是将用户或请求对象传递给类的方法。但是还有其他方法可以访问请求。
这是我们使用的代码。您需要将此中间件添加到 MIDDLEWARES。并导入和调用 get_request 函数。
2017 年 7 月更新:使用 Python 3.6.1 和 Django 1.10.7 进行测试,基于此答案的原始代码和编写您自己的中间件文档。
startapp request_middleware
."request_middleware"
到您INSTALLED_APPS
的settings.py
.request_middleware.middleware.py
."request_middleware.middleware.RequestMiddleware"
到您的MIDDLEWARE
in 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_middleware.middleware import get_request
中使用即可。get_request