你好 WSGI 应用

下面我们尝试创建一个最小化的 WSGI 应用。

一个 WSGI 应用是一个可以被 request 触发的 python 可调用对象(实现了__call__魔法函数,类、函数都可以),该对象需接受两个参数, environ 和 start_response。

Environ 是一个 python 字典,包含了CGI 环境变量的信息。start_response 是一个回调函数,接受两个参数 status 和 headers,对应了 http 协议的状态码和 http headers。

Environ 和 start_response 回调函数都是由 WSGI 服务端传递到应用端的,WSGI 服务器决定环境变量该如何设置,start_response 该怎么实现。WSGI 应用端仅仅是接受它们,然后生成状态码和 headers,最后经由 start_response 函数返回结果。

def hello_world_app(environ, start_response):
    status = '200 OK'  # HTTP Status
    # HTTP Headers
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)

    return [b"Hello World"]

运行 WSGI 应用

为了运行上面这个迷你 WSGI 应用,我们需要一个 WSGI 服务器,当然 gunicorn,uwsgi 这些生产型服务器都是可以满足要求的,但我们这里为了简便,仅仅使用 python 标准库自带的一个简易 WSGI 测试服务器。

from wsgiref.simple_server import make_server

def hello_world_app(environ, start_response):
    status = '200 OK'  # HTTP Status
    # HTTP Headers
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)

    return [b"Hello World"]

httpd = make_server('', 8000, app)
print("Serving on port 8000...")
# Serve until process is killed
httpd.serve_forever()