SAE wsgi簡(jiǎn)單介紹

2018-07-25 14:26 更新

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)容來獲取幫助信息。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)