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

Posted thescholar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 '怎么获取用户对象?'

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

以上是关于Django中非视图函数获取用户对象的主要内容,如果未能解决你的问题,请参考以下文章

试图从 API 获取 json 中非对象的属性

Django-再谈views视图

Django视图层

django views.py视图 获取用户请求相关信息以及请求头

当我从用户获取数据并将其保存到 SQLite 数据库中时,我应该怎么做才能使列表视图在片段中工作

如何从中间件中的 Django 请求对象获取视图中使用的模型名称?