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)
之类的内容来获取帮助信息。
更多建议: