我有谁需要登录的用户的信息的类方法(图外)。 我怎样才能检索到,而没有经过请求方法登录的用户? 不幸的是我无法找到一个无处很好的解决方案,它是不符合逻辑的只是不存在这样的方式来做到这一点,因为Django的应该在一些地方保存登录的用户。 否则,(我相信)这将是不可能使用@login_required
装饰从django.contrib.auth.decorators
。 对?
所以,如果这是不可能的,为什么它不是? 为什么Django的工作原理是这样,如果只想到我要的是里面的登录用户,而不是所有的信息request
?
提前致谢。
关于装饰,这是错误的。 其实装修调用请求的参数。
我认为,更好的办法是,通过用户或请求对象类的方法。 但也有其他的方式来访问请求。
下面是我们使用的代码。 您需要将此中间件加入到中间件。 和进出口调用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
在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
在你的代码。