6

ここで提案されているものrequestに基づいて、プロジェクト内のどこにいてもオブジェクトにアクセスできるようにするdjangoカスタムミドルウェアを実装しようとしています。この記事はかなり前に書かれたもので、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 に答える