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