本文主要分析的是web.py庫的application.py這個模塊中的代碼??偟膩碚f,這個模塊主要實現了WSGI兼容的接口,以便應用程序能夠被WSGI應用服務器調用。WSGI是Web Server Gateway Interface的縮寫,具體細節可以查看WSGI的WIKI頁面
接口的使用
使用web.py自帶的HTTP Server
下面這個例子來自官方文檔的Hello World,這個代碼一般是應用入口的代碼:
import weburls = ("/.*", "hello")app = web.application(urls, globals())class hello: def GET(self): return 'Hello, world!'if __name__ == "__main__": app.run()
上面的例子描述了一個web.py應用最基本的組成元素:
URL路由表 一個web.application實例app 調用app.run()其中,app.run()的調用是初始化各種WCGI接口,并啟動一個內置的HTTP服務器和這些接口對接,代碼如下:
def run(self, *middleware): return wsgi.runwsgi(self.wsgifunc(*middleware))
與WSGI應用服務器對接
如果你的應用要與WSGI應用服務器對接,比如uWSGI,gunicorn等,那么應用入口的代碼就要換一種寫法了:
import webclass hello: def GET(self): return 'Hello, world!'urls = ("/.*", "hello")app = web.application(urls, globals())application = app.wsgifunc()
在這種場景下,應用的代碼不需要啟動HTTP服務器,而是實現一個WSGI兼容的接口供WSGI服務器調用。web.py框架為我們實現了這樣的接口,你只需要調用application = app.wsgifunc()就可以了,這里所得到的application變量就是WSGI接口(后面分析完代碼你就會知道了)。
WSGI接口的實現分析
分析主要圍繞著下面兩行代碼進行:
app = web.application(urls, globals())application = app.wsgifunc()
web.application實例化
初始化這個實例需要傳遞兩個參數:URL路由元組和globals()的結果。
另外,還可以傳遞第三個變量:autoreload,用來指定是否需要自動重新導入Python模塊,這在調試的時候很有用,不過我們分析主要過程的時候可以忽略。
application類的初始化代碼如下:
class application: def __init__(self, mapping=(), fvars={}, autoreload=None): if autoreload is None: autoreload = web.config.get('debug', False) self.init_mapping(mapping) self.fvars = fvars self.processors = [] self.add_processor(loadhook(self._load)) self.add_processor(unloadhook(self._unload)) if autoreload: ...
其中,autoreload相關功能的代碼略去了。其他的代碼主要作了如下幾個事情:
self.init_mapping(mapping):初始化URL路由映射關系。 self.add_processor():添加了兩個處理器。新聞熱點
疑難解答