我正在尝试实现一个
django自定义中间件,它允许我访问请求对象,无论我在我的项目中的哪个位于
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()