django 1.5中的django.utils.thread_support
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django 1.5中的django.utils.thread_support相关的知识,希望对你有一定的参考价值。
我正在尝试实现一个django自定义中间件,它允许我访问request
对象,无论我在我的项目中,基于the one suggested here。那篇文章是很久以前写的,django 1.5没有库那里的thread_support
。我应该使用什么替代方法来完成一个线程安全的本地存储来存储请求对象?这是自定义中间件中的代码:
from django.utils.thread_support import currentThread
_requests = {}
def get_request():
return _requests[currentThread()]
class GlobalRequestMiddleware(object):
def process_request(self, request):
_requests[currentThread()] = request
当然,它引发了一个例外:
ImproperlyConfigured: Error importing middleware myProject.middleware.global:
"No module named thread_support"
编辑:
我发现了一个有效的方法:
from threading import local
_active = local()
def get_request():
return _active.request
class GlobalRequestMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
_active.request = request
return None
现在我有一个问题:是否会导致内存泄漏? _active
会发生什么?当请求死亡时它被清理了吗?无论如何,已经发布了一个有效的答案。我将接受它,但任何其他(更好的,如果可能的话)解决方案将非常受欢迎!谢谢!
更换
from django.utils.thread_support import currentThread
currentThread()
同
from threading import current_thread
current_thread()
对于未来的googlers,现在有一个python包提供了这个中间件的更强大的版本:django-crequest
以上是关于django 1.5中的django.utils.thread_support的主要内容,如果未能解决你的问题,请参考以下文章
django.test.TestCase vs unittest vs django.utils.unittest.TestCase 之间的区别
为啥在 django.utils.deprecation.py 中声明中间件 mixin
从“django.utils.encoding”导入错误“force_text”
十Django3.0学习之django.utils.encoding未发现 python_2_unicode_compatible包