6

我正在尝试实现一个 django 自定义中间件,该中间件让我可以访问request我在项目中的任何位置的对象,基于此处建议的一个。那篇文章是很久以前写的,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?请求终止时是否已清理?无论如何,已经发布了一个有效的答案。我会接受它,但任何其他(如果可能的话,更好的)解决方案都将受到欢迎!谢谢!

4

2 回答 2

2

代替

from django.utils.thread_support import currentThread
currentThread()

from threading import current_thread
current_thread()
于 2014-09-12T04:53:41.233 回答
1

对于未来的 googlers,现在有一个 python 包提供了这个中间件的更强大的版本:django-crequest

于 2018-05-02T22:51:49.323 回答