在使用webpy時發現的web.application reload的陷阱,暫時記錄下來,以便自己和他人蔘考。
現象是這樣的:
在設定檔中定義urls:
urls = (
# front page
"/", "app.controllers.base.index",
"/index/", "app.controllers.base.index",
)
同時為了隱藏部分url對應關係,在程式中增加url映射關係如下:
self._app.add_mapping(url_login, Login)
self._app.add_mapping(url_logout, Logout)
啟動webpy主程式碼如下:
app = web.application(urls, globals())
app.run()
系統運行時訪問url_login卻提示404 Not Found錯誤,也就是說程式中增加(url_login, Login)的映射並沒有真正成功。
通過跟蹤分析webpy源碼發現,原來webpy為了提高開發環境下的調試效率,特意在構造application時可以指定是否autoreload url配置,如果在建立application時autoreload為None或者web.config.debug 為 True,則在每次處理每一個request時都重新載入mapping,如果autoreload為True,則每次重新構建時mapping都被初始化為建立application時傳入的urls。也就是說在程式中增加的mapping都會在處理request時被清除。
為解決這一問題,可以在建立application時將autoreload設定為False或者將web.config.debug設定為False,代碼如下
# in development debug error messages and reloader
web.config.debug = False
# in production, we should disable the autoreload of the urls mapping
app = web.application(urls, globals(), autoreload = False)