SAE wsgi简单介绍
SAE 的初始化的 Python 项目,在对应版本的目录下,只有两个文件:
- config.yaml - index.wsgi
config.yaml 是 SAE 的项目配置文件。先不管它。index.wsgi 就是 wsgi 接口的 application 的定义文件。
这个文件虽然扩展名是 .wsgi,其实它就是普通的 Python 文件,根据 SAE 的环境要求,它里面需要定义一个名为 application 的可调用对象(比如一个函数)。这个 application 实现的是 wsgi 接口的规范。
wsgi 的这套东西不用太细究,我们只用到它的基础形式就可以让我们的应用跑起来了。
初始状态的 index.wsgi 大概是这样的样子的:
def application(environ, start_response):
start_response('200 ok', [('content-type', 'text/plain')])
return ["Hello SAE"]
application 的可调用对象(函数), 接收两个参数,environ 和 start_response。
start_response 是一个函数,用以响应 HTTP 的头。 比如上面的代码中,对 start_response 的调用即是,响应的状态码是 200 ,有一个 content-type 的头,表明响应的内容是纯文本。
application 函数需要返回一个 iterable 的对象,比如一个列表。里面的内容就是 HTTP 响应的 body 部分。
一个请求的所有细节,比如 GET 参数,POST 参数,请求头这些,都封装在 environ 对象里了。这是一个类似于 dict 的对象,相应的属性都通过 key 的方式获取,比如获取 GET 参数,就是 environ['QUERY_STRING']。
在后面我们可能还需要继续和 environ 对象打交道,所以我们最好自己做一个 wsgi 的运行环境,以方便需要查看地 environ 的细节。用 Tornado 做这事很容易。
在目录下新建一个 server.py 文件,内容如下:
# -*- 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 中返回内容了。同理,我们可以随时在 application 中加入 print dir(environ) 之类的内容来获取帮助信息。