SAE 的初始化的 Python 項目,在對應版本的目錄下,只有兩個文件:
- config.yaml - index.wsgi
config.yaml
是 SAE 的項目配置文件。先不管它。index.wsgi
就是 wsgi 接口的 application 的定義文件。
這個文件雖然擴展名是 .wsgi
,其實它就是普通的 Python 文件,根據(jù) SAE 的環(huán)境要求,它里面需要定義一個名為 application
的可調用對象(比如一個函數(shù))。這個 application
實現(xiàn)的是 wsgi 接口的規(guī)范。
wsgi 的這套東西不用太細究,我們只用到它的基礎形式就可以讓我們的應用跑起來了。
初始狀態(tài)的 index.wsgi
大概是這樣的樣子的:
def application(environ, start_response): start_response('200 ok', [('content-type', 'text/plain')]) return ["Hello SAE"]
application
的可調用對象(函數(shù)), 接收兩個參數(shù),environ
和 start_response
。
start_response
是一個函數(shù),用以響應 HTTP 的頭。 比如上面的代碼中,對 start_response
的調用即是,響應的狀態(tài)碼是 200 ,有一個 content-type
的頭,表明響應的內(nèi)容是純文本。
application
函數(shù)需要返回一個 iterable
的對象,比如一個列表。里面的內(nèi)容就是 HTTP 響應的 body 部分。
一個請求的所有細節(jié),比如 GET 參數(shù),POST 參數(shù),請求頭這些,都封裝在 environ
對象里了。這是一個類似于 dict 的對象,相應的屬性都通過 key 的方式獲取,比如獲取 GET 參數(shù),就是 environ['QUERY_STRING']
。
在后面我們可能還需要繼續(xù)和 environ
對象打交道,所以我們最好自己做一個 wsgi 的運行環(huán)境,以方便需要查看地 environ
的細節(jié)。用 Tornado 做這事很容易。
在目錄下新建一個 server.py
文件,內(nèi)容如下:
# -*- coding: utf-8 -*- import imp with open('index.wsgi', 'rb') as f: sae_application = imp.load_source('', 'index.wsgi', f).application import tornado.httpserver import tornado.wsgi import tornado.ioloop def main(): app = tornado.wsgi.WSGIContainer(sae_application) server = tornado.httpserver.HTTPServer(app) server.listen(8888) tornado.ioloop.IOLoop.instance().start() if __name__ == '__main__': main()
這個服務會讀入 index.wsgi
中的 application
對象,然后讓它在一個 Web 服務器上跑起來。
python server.py
服務啟動之后,在瀏覽器訪問 http://localhost:8888
就可以看到 application
中返回內(nèi)容了。同理,我們可以隨時在 application
中加入 print dir(environ)
之類的內(nèi)容來獲取幫助信息。
更多建議: