SAE wsgi简单介绍

2018-07-25 14:26 更新

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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号