Flask請求上下文源碼剖析流程3(Flask中如何處理請求)

1、通過查看源碼可以發現,request是一個全局變量,在程序啓動時就已經創建了

 

        其中偏函數partial的使用如下:

                        v = partial(add,1)

                        當執行v()時,會將參數1傳給add方法!

1.2、執行LocalProxy的__init__方法,其中local參數就是偏函數partial,即:

         local = partial(_lookup_req_object, 'request')

 

2、如下視圖函數中如何打印request對象,如  print(request)?(print(session)同理)

from flask import Flask,request,session

app = Flask(__name__)

@app.route("/",method=['GET','POST'])
def index():
    #request是LocalProxy對象
    print(request) #LocalProxy.__str__-->str(LocalProxy._get_current_object)-->調用偏函數-->ctx.request
    print(session)#LocalProxy.__str__-->str(LocalProxy._get_current_object)-->調用偏函數-->ctx.session
    return "index"

if __name__ == '__main__':
    app.__call__
    app.wsgi_app
    app.request_class
    app.run()

2.1、執行LocalProxy的__str__方法

其中x就是self當前對象,將調用LocalProxy類的_get_current_object方法。

2.2、LocalProxy類的_get_current_object方法

該函數內部將調用local = partial(_lookup_req_object, 'request'),獲取RequestContext對象,獲取request對象。

2.3、執行偏函數partial(_lookup_req_object, 'request')

2.3.1、將執行LocalStack中的top方法,獲取Local類中該線程/協程id標示下的stack列表的最後一項,即請求數據RequestContext。

2.3.2、所以3.3中的return getattr(top,name)即返回ctx中的request值。

3、如下視圖函數中如何執行request方法,如  request.method?

from flask import Flask,request,session

app = Flask(__name__)

@app.route("/",method=['GET','POST'])
def index():
    #request是LocalProxy對象
    print(request) #LocalProxy.__str__-->str(LocalProxy._get_current_object)-->調用偏函數-->ctx.request
    print(session)  # LocalProxy.__str__-->str(LocalProxy._get_current_object)-->調用偏函數-->ctx.session
    request.method #LocalProxy.__getattr__-->
                            #1、 LocalProxy._get_current_object-->調用偏函數-->ctx.request
                            #2、getattr(self._get_current_object(), name)   -->ctx.request.method
    request.path  # LocalProxy.__getattr__-->
                            # 1、 LocalProxy._get_current_object-->調用偏函數-->ctx.request
                            # 2、getattr(self._get_current_object(), name)   -->ctx.request.path

    return "index"

if __name__ == '__main__':
    # app.__call__
    # app.wsgi_app
    # app.request_class
    app.run()

3.1、執行LocalProxy.__getattr__方法,參數是method

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章