今天遇到了一个问题:在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
时间: 2024-10-31 15:29:07