Django中非视图函数获取用户对象

今天遇到了一个问题:在Django中怎么从非视图函数中获取用户对象?怎么保证不同的请求获取到不同的用户对象?
平常我们获取用户对象使用的是:

request.user

不得不说,这确实很方便。
但是,如果现在有两个类:

# 注意,这两个类可以不在同一个py文件中


# 视图类
class Index(View):
    """
    功能集中调用
    """
    def post(self, request):
        return HttpResponse('你好!')

# 工具类
class IndexUtil:
    def get_user(self)
        return '怎么获取用户对象?'

因为工具类并没有拿到request对象,所以无法利用request.user获取用户对象
我的第一个想法是利用缓存,但问题是我没有办法将此次请求和此次请求的用户对象相关联,那就可能会导致此次请求拿到的是上次请求的用户对象,所以这个方案直接pass掉。
之后又谷歌了很多资料,最后找到了一个完美的解决方案:利用线程存储用户对象,当然这需要一个请求对应一个线程。
下面是具体的代码:

# 注意,这两个类可以不在同一个py文件中

# 视图类
from threading import local
thread = local()


class Index(View):
    """
    功能集中调用
    """
    def post(self, request):
        global thread
        thread.user = request.user
        return HttpResponse('你好!')

# 工具类
class IndexUtil:
    def get_user(self)
        print(thread.user)
        return '怎么获取用户对象?'

注意:如果两个类不再同一个文件中,那么有可能会遇到循环引用的问题。各位可以在我的另一篇博文中找到解决方案。

原文地址:https://www.cnblogs.com/thescholar/p/12228327.html