SAE wsgi簡單介紹

2018-07-25 14:26 更新

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號