プロセス全体を読み取るフラスコフレームワークソースコード
「」「 App.runは、() 、本質的に実行されるrun_simpleです(IP、ホストは、セルフ) セルフは、現在のターゲットのアプリで アプリ.__ call__ 」「」
_request_ctx_stack = LocalStack() _app_ctx_stack = LocalStack() CURRENT_APP = LocalProxy(_find_app) リクエスト = LocalProxy(部分(_lookup_req_object、" 要求" )) セッション = LocalProxy(部分(_lookup_req_object、" セッション"))
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(エラー)
#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 =要求
#オブジェクト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]
#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時間の目的です。