作者:acezio鏈接:https://zhuanlan.zhihu.com/p/21358368來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 flask的url route管理 定義flask實例的route時,使用一個裝飾器來裝飾函數,例如: 1 app = F ...
作者:acezio
鏈接:https://zhuanlan.zhihu.com/p/21358368
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
flask的url route管理
定義flask實例的route時,使用一個裝飾器來裝飾函數,例如:
1 app = Flask(__name__) 2 @app.route('/') 3 def index(): 4 return "<h1>hello world!</h1>"
通過閱讀這段代碼,發現Flask在每個實例里定義了一個Map類(從werkzeug導入)url_map,一個字典view_functions。 註冊路由分為兩步。 第一步是通過一個Rule類作為入參調用Map類的add方法向url_map里添加一個路由規則,url_map里有一個列表_rules,用來存儲實例下所有的路由規則,這個列表的每一個元素都是一個Rule類,其次,url_map中還有一個字典_rules_by_endpoint,這個字典也是存儲路由規則的,不過它按照endpoint把它們分開存儲了,key值就是endpoint,value是個Rule類。endpoint用來生成URL,可以是字元串、數字甚至是函數,這裡使用的是註冊的路由處理函數的名字。在向url_map添加路由規則的時候,會觸發Rule類實例的綁定方法bind(),這個方法把url_map加入到Rule實例的成員變數中,並觸發編譯方法compile(),把rule規則和各路由選項解析生成正則表達式並存儲進Rule實例中。 第二步是把需要註冊的路由處理函數加入到Flask實例的字典view_functions中,key即為函數名。 到這裡,flask生成了一個URL route系統,具體如何命中,繼續研究代碼。