WERKZEUGローカル、LocalStackとLocalProxy技術のフラスコ

ローカルとは何ですか

  1. WSGI各要求は、[ローカルに使用されるこの要求のグローバル変数に格納されている。ローカル要求ごとにグローバルコマンド空間としてデータを処理する進む取り外しステートレスは、各要求は個人所有されています
  2. ローカルLocalStackと同様に、スタックモードローカル基礎で動作するために使用、管理
  3. 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ます

このような使用の利点は何ですか

  1. 基礎となるオペレーティング・コルーチンでサポートされている、同時展開の効率を向上させます
  2. 管理と全体の転送要求コンテキストの適用を避けます
  3. プラグインは、サードパーティ製アプリケーションの拡大を達成するために、互換性の完璧な拡張
  4. 可読性強い、簡単な操作、親しみ

おすすめ

転載: www.cnblogs.com/spaceapp/p/12157940.html