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()