0

リクエストをスレッドコンテキストに保持するdjangoのミドルウェアを定義しようとすると、奇妙な変数ドメインの問題に直面します。ビュー ファイルの API からメソッド「get」にアクセスしようとすると、最初のコード セクションでエラーが発生します。2 番目のコード例はうまく機能します。どうして???

例 1 (機能しません):

class ContextHandler(object):
    #_LOCALS = threading.local()

    def process_request(self, request):
        self._LOCALS = threading.local()
        self._LOCALS.x = "alon"
        return None

例 2 (動作):

class ContextHandler(object):
    _LOCALS = threading.local()

    def process_request(self, request):
        self._LOCALS.x = "alon"
        return None

一般的な取得方法:

@classmethod
    def get(cls):
        return getattr(cls._LOCALS, 'x', None)

ありがとう!

4

2 に答える 2

0

最初の例では、クラス プロパティはありません_LOCALS。これはインスタンス プロパティです。したがって、最初のケースContextHandler._LOCALSでは isNoneで、clsinget()ContextHandlerです。

スレッドセーフなコードが必要な場合は、固執しないで@classmethodください

class ContextHandler(object):
    _LOCALS = threading.local()

私が知る限り、クラス定義は一度だけ処理されます (おそらくメインスレッドで)。私はむしろ初期化_LOCALSしてインスタンスメソッドprocess_request()を作りたいです:get()

class ContextHandler(object):

    def process_request(self, request):
        self._LOCALS = threading.local()
        self._LOCALS.x = "alon"
        return None

    def get(self):
        return getattr(self._LOCALS, 'x', None)
于 2013-07-17T15:35:35.513 に答える