简单谈谈Python WSGI规范
WSGI规范
WSGI规范是Python Web开发中的底层基础。相对于http.server,现在的HTTP开始已经使用更通用的WSGI协议了。但WSGI不支持异步web服务器。
WSGI规范规定每个Application必须是一个可调用对象,这个可调用对象可以是类也可以是函数,实现了call方法,接受两个参数,environ和start_response函数,负责响应请求的函数,并返回一个可迭代对象。
其中,environ、start_response是HTTP服务器实现的。environ变量是包含环境信息的字典,每个application对象在返回前调用start_response。start_response也是可调用对象,可以传入两个参数:status、response_headers。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
def application(environ, start_response): html_body = "WSGI Application\r\n" status = "200 OK"
response_headers = [('Content-Type', 'text/plain'),('Content-Length', str(len(html_body)))]
start_response(status, response_headers)
// yield 可以使用yield返回信息
return [html_body]
|
那么,HTTP服务器上又如何处理envir和start_response呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import os import sys
def run_wsgi(application): environ = dict(os.environ.items()) environ['wsgi.input'] = sys.stdin
headers_set = [] headers_sent = []
def write(data): sys.stdout.write(data) sys.stdout.flush()
def start_response(status, response_headers): headers_set[:] = [status, response_headers] return write
result = application(environ, start_response)
try: for data in result: if data: write(data) finally: if hasattr(result, 'close'): result.close()
|
Middleware
middleware位于服务器和应用程序之间,像管道一样在在两端传递请求相关的数据。具体操作如下:
- 被服务器调用,返回结果
- 调用应用程序,把参数传递过去
参考
[1] PEP333
转载请包括本文地址:https://allenwind.github.io/blog/2065
更多文章请参考:https://allenwind.github.io/blog/archives/