プロセス全体を読み取るフラスコフレームワークソースコード

プロセス全体を読み取るフラスコフレームワークソースコード

「」「
App.runは、() 本質的に実行されるrun_simpleです(IP、ホストは、セルフ)
セルフは、現在のターゲットのアプリで
アプリ.__ call__ 
」「」

golbalファイルは、これらのオブジェクトを生成します

_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
CURRENT_APP = LocalProxy(_find_app)
リクエスト = LocalProxy(部分(_lookup_req_object、" 要求" ))
セッション = LocalProxy(部分(_lookup_req_object、" セッション"))

要求があるたびにapp.wsig_app(環境、start_responseを)実行されます

app.wsig_app出典:

    DEFのwsgi_app(セルフ、環境、start_responseを):
        RequestContextのオブジェクト、何か現在のリクエストが含まれています。
        = CTXのself.request_context(ENVIRON)
        エラー = なし
         トライトライ#1 RequestContextのオブジェクト、ctx.push、プッシュ方式が実行されるRequestContextのオブジェクト
                CTXは、ローカルに配置され
                ctx.push()
                要求と拡張応答関数 
                応答= self.full_dispatch_request()
             を除き、例外としてE:
                エラー = E 
                レスポンス =self.handle_exception(E)
             を除く#1 noqa:B001 
                エラー= sys.exc_info()[1 ]
                 レイズ
            リターン応答(環境、start_responseを)
         最後にもしself.should_ignore_error(エラー):
                エラー = なし
            ctx.auto_pop(エラー)

CTX = self.request_context(環境)何をしましたか?以下のような、関連するすべてのものを要求することがあるCTX = RequestContextのオブジェクト、:

1私たちself.request_context(環境)の実行です:だからCTXはRequestContextの(自己、環境)の戻り値である:
        DEF request_context(セルフ、ENVIRON):
            リターンCTXへの待機はRequestContextの()を実行した結果です。
            リターンRequestContextの(自己、ENVIRON)
2 RequestContextの(自己、ENVIRON)実装の結果は何ですか?RequestContextのは以下のようなreuqest情報を含むオブジェクトである
クラスRequestContextの(オブジェクト):
    アプリケーション、環境、CTX、RequestContextのオブジェクトである
    DEFの __init__(セルフ、アプリケーション、環境、要求=なし、セッション= なし):
        セルフ.APPは = のApp
         IFの要求は、IS :なし
            リクエスト =app.request_class(環境)
        self.request =要求

ctx.push()、ここではCTXは、対象RequestContextのです

オブジェクトRequestContextの実施のプッシュ方法1 ctx.push方法:出典:
    DEF プッシュ(自己):
        現在自己がRequestContextのオブジェクトでは、CTX、ある
        _request_ctx_stack.push(自己)
 2 _request_ctx_stack、我々はそれを発見しましたこれは、グローバルLocalStack()オブジェクトです。_Request_ctx_stack.push(セルフ)のメソッドLocalStackプッシュの実装であり、方法#1 _request_ctx_stack.pushに渡さCTXを押します。CTX =自己LocalStackプッシュ出典:
  
    DEFのプッシュ(セルフ、OBJ):
        RV = GETATTR(self._local、" スタック" 、なし)
         のIF RVはありませんなし:
             ストレージ[スレッドのコルーチンID] [ "スタック" ] = []
            = RV = self._local.stack [] 
        rv.append(OBJ)
        リターンRVの
    
コードself._localローカルオブジェクト上のデータのセキュリティを確保するために使用されます。ときにコードが実行されるself._local.stack = RV = []、[ローカルストレージ構造の目的である:ストレージ[スレッドコルーチンのID] [ "スタック"] = [] 
#1 rv.append(OBJ)、ストレージ[スレッドのコルーチンのID] [ "スタック"] = [OBJ]、 及びOBJ = CTXため、偶数CTXローカルオブジェクト内に配置されます。構造などの局所()。ストレージ[スレッドコルーチンID] [ "スタック"] = [CTX]

応答= self.full_dispatch_request()

1 この文は、拡張と応答関数を実行するために私達を依頼することです
。#あなたが要求を使用することができ、その後、延長要求と応答機能を、そしてそれを達成することであるならば?
フラスコインポートフラスコ、リクエスト、セッション
のApp =フラスコ(__name__ DEFのインデックス():
     印刷(request.method)
     印刷(セッション)
     リターンOK などの要求に関連する内容を取得するために上記のコードrequest.method、などそれは?2 我々はポイントが何であるか、リクエスト見ることを得ますか?
= LocalProxy要求(部分(_lookup_req_object、リクエスト))
私たちは、要求の対象がLocalProxyであることがわかりました。  





その後、我々は別の方法LocalProxyプロパティを見つけることができませんが、何を発見しなければならない、何があるので、それは__getattr__書きませんしなければなりません我々は__getattr__ソースを見て:
 DEF  __getattr__ (セルフ、名):
        request.methodを、名前は今です方法、
        IF名== __members__ リターンDIR(self._get_current_object())
        今名方法の側面に結果self._get_current_object()関数の実行結果である
        方法を得るために部分関数の結果、
        部分関数の実行結果がリクエスト。
        etattr(要求、メソッド、)
        リターンのgetattr(self._get_current_object()、名前)
    
    
    
3      私たちは_get_current_objectを見て()の実行結果は何ですか?self._get_current_object()ソース:
    DEFの_get_current_object(自己):
             戻り。自己__local ()       
self._get_current_object()の実行結果上記は自己.__ローカル()の実行結果である


4 セルフ.__何がローカルにありますか?私たちは、これが自己.__渡さ現地時間、また地元、次のコードのインスタンスで発見した
 DEFの __init__(自己、ローカル、名前= :なし)
         #の自己.__ローカル_LocalProxy__local = = =部分ローカル(_lookup_req_object、「要求」)
        自己.__ローカルプロパティセット非表示にするには、 
        オブジェクト。__setattr__(セルフ、" _LocalProxy__local " 、ローカル)
        .__ =ローカルローカル自己
    
ローカルインスタンス化が送信されます。私たちは、このLocalProxy(部分(_lookup_req_object、 "要求"))のインスタンス私たちの自己.__ =ローカル=は、ローカル=部分self._get_current_object(_lookup_req_objectを、 "要求") 

5 :最終的に我々は理解
DEF  __getattr__ (セルフ、名前を):
        request.method、名前は今の方法で、
        IF名== " __members__ " リターンDIR(self._get_current_object())
         のリターンのgetattr(self._get_current_object()、名前)
    
self._get_current_object()の実行結果、部分(_lookup_req_object、「要求」)の結果。GETATTR(ctx.request、方法)に対応する(名称self._get_current_object())がGETATTR、ctx.requestある

6。 部分(_lookup_req_objectは、 "要求")()の実行の結果
#1 として次さ_lookup_req_objectコード:

DEFの_lookup_req_object (名):
    ここでの名前は「要求」で 
    トップ= _request_ctx_stack.top 
  
    トップは誰ですか?CTXです。
    IFトップはありませんなし:
         昇給はRuntimeError(_request_ctx_err_msg)
    トップ内部の要求を見つけるために、すなわち、トップ= CTX - 「内部要求を見つけるCTX。
    戻りGETATTR(トップ、名前)

7 そして、オブジェクトがあるので_request_ctx_stack LocalStack()オブジェクト、_request_ctx_stack.topはトップでLocalStack()が実行されるように:
#1 _request_ctx_stack.topソース:
    @Property
     DEF トップ(セルフ):
         試してみるストレージ[スレッド協会チェンID] [ "スタック"] = [CTX] 
            今トップretrun値CTXの上に
            戻り self._local.stack [-1 ]
         を除く(はAttributeError、はIndexError):
             戻りなし
 #のコードはself._localローカルオブジェクトであり、現地では私たちの存在のCTX時間の目的です。        

 

おすすめ

転載: www.cnblogs.com/baohanblog/p/12535584.html