ローカルとは何ですか
- WSGI各要求は、[ローカルに使用されるこの要求のグローバル変数に格納されている。ローカル要求ごとにグローバルコマンド空間としてデータを処理する進む取り外しステートレスは、各要求は個人所有されています
- ローカルLocalStackと同様に、スタックモードローカル基礎で動作するために使用、管理
- LocalProxyプロキシクラス、またはローカルエージェント例LocalStack
なぜローカル
むしろthreading.localよりなぜカスタムローカル、。これは、カーネルによって決定されます
1.ウェブアプリケーションを起動した後、HS +一行は、その後、プロセスを開始し、グローバル変数を区別することができない汚染、
2.作業が保証できず、それぞれ他から独立して、複数のスレッドに配置されている間マルチスレッディングHS +は、要求分布コルーチンの仕事を保証することはできません
だから、:WERKZEUGは自分のソリューションを提供します:ローカルおよびLocalStack
なぜLocalProxy
そこで質問です:ときマルチタスクという点で、要求されたローカルおよびLocalStackを保存するプライベート変数の文脈、フラスコのインポート要求、G、セッションからの各呼び出し、混乱正しいコンテキストを取得し、いないことを確認する方法?
では flask.globals.py で
デフ_lookup_req_object(名): トップ = _request_ctx_stack.top 場合はトップがあるなし: 昇給はRuntimeError(' 要求コンテキストの外での作業' ) の戻りGETATTR(トップ、名) _request_ctx_stack = LocalStack() 要求 = LocalProxy(部分(_lookup_req_object、' 要求' )) セッション = LocalProxy(部分(_lookup_req_object、' セッション'))
で werkzeug.local.py で、LocalProxyは、ローカルまたはLocalStackの薬剤であります
@implements_boolの クラスLocalProxy(オブジェクト): "" "" "" __slots__ =(" __local "、" __dict__ "、" __name__ "、" __wrapped__ " ) デフ __init__(自己、ローカル、名前= なし): オブジェクト。__setattr__(自己、" _LocalProxy__local " 、ローカル) オブジェクト。__setattr__(自己、" __name__ " 、 hasattr(ローカル、「__release_local__ 」): #「ローカル」はローカルまたはのインスタンスではないという呼び出し可能です 。#LocalManager:包まれた機能としてそれをマーク。 オブジェクト。__setattr__(自己、「__wrapped__ 」、ローカル) デフ_get_current_object(自己): 「」」戻る現在のオブジェクトあなたが本当たい場合に便利です。 パフォーマンス上の理由または理由時点で、プロキシの背後にあるオブジェクトを 使用すると、オブジェクトを渡したいです異なるコンテキストに。 「」」 もし ないはhasattr(自己。__local、__release_local__ " ): リターン。自己__local () してみてください: リターンのgetattr(自己を。__local、自己を。__name__ ) 以外はAttributeError: 昇給はRuntimeError(" %sのにバインドされていないオブジェクト」。%の自己を__name__ ) デフ __getattr__ (自己、名): もし名前== " __members__ " : リターンDIR(self._get_current_object()) のリターン GETATTR(self._get_current_object()、名前)
コールreqeust:動的要求<=動的_request_ctx_stack.top <= LocalStack()(リクエスト)の方法を用いて結合新しいコール・インスタンスが生成されるたびに、<= LoaclStack.callか?
はい、各呼び出し要求は、それが新しいプロキシインスタンスを生成します、すべてのポップ、プッシュ、トップはローカル操作、およびLocalプロパティの割り当てと取得のためget_identのために取得されています!
以下のような:werkzeug.local.Local.py
クラスローカル(オブジェクト): __slots__ =(" __storage__ "、" __ident_func__ " ) デフ __init__ (自己): オブジェクト。__setattr__(自己、" __storage__ " 、{}) オブジェクト。__setattr__(自己、" __ident_func__ " 、get_ident) "" "" "" DEF __getattr__ (自己、名): 試してみる: リターン・セルフ。__storage__ [セルフ。除くKeyError例外: 昇給はAttributeError(名) デフ __setattr__ (自己、名前、値): IDENT =自己。__ident_func__ () ストレージ =自己。__storage__ 試み: ストレージ[IDENT] [名] = 値 以外KeyError例外: ストレージ[IDENT] = {名前:値}
完璧!新しいリクエストが来るたびに、フラスコを使用またはIDコルーチンによって得られたスレッドに保存されているローカルコンテキストをWERKZEUGます
このような使用の利点は何ですか
- 基礎となるオペレーティング・コルーチンでサポートされている、同時展開の効率を向上させます
- 管理と全体の転送要求コンテキストの適用を避けます
- プラグインは、サードパーティ製アプリケーションの拡大を達成するために、互換性の完璧な拡張
- 可読性強い、簡単な操作、親しみ