-->

Django: How can i get the logged user outside of v

2019-08-31 14:30发布

我有谁需要登录的用户的信息的类方法(图外)。 我怎样才能检索到,而没有经过请求方法登录的用户? 不幸的是我无法找到一个无处很好的解决方案,它是不符合逻辑的只是不存在这样的方式来做到这一点,因为Django的应该在一些地方保存登录的用户。 否则,(我相信)这将是不可能使用@login_required装饰从django.contrib.auth.decorators 。 对?

所以,如果这是不可能的,为什么它不是? 为什么Django的工作原理是这样,如果只想到我要的是里面的登录用户,而不是所有的信息request

提前致谢。

Answer 1:

关于装饰,这是错误的。 其实装修调用请求的参数。

我认为,更好的办法是,通过用户或请求对象类的方法。 但也有其他的方式来访问请求。

下面是我们使用的代码。 您需要将此中间件加入到中间件。 和进出口调用get_request功能。

更新2017年7月:与Python 3.6.1和Django的1.10.7测试,基于从这个答案和原代码编写您自己的中间件文档。

  • 首先创建一个新的应用程序,即。 startapp request_middleware
  • 然后添加"request_middleware"INSTALLED_APPSsettings.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

之后,根本就from request_middlware.middleware import get_request为了使用get_request在你的代码。



文章来源: Django: How can i get the logged user outside of view request?