WSGI 到底是什么接口?Flask 对象的真实结构是什么?能不能不借助任何服务器就调用它?这篇从 environ 与 start_response 开始,一层层验证。
源码:
1 | environ = {"REQUEST_METHOD": "GET", "PATH_INFO": "/hello", "QUERY_STRING": "n=1", "SERVER_NAME": "x", "SERVER_PORT": "80",
2 | "wsgi.version": (1, 0), "wsgi.url_scheme": "http", "wsgi.input": io.BytesIO(b""), "wsgi.errors": sys.stderr,
3 | "wsgi.multithread": False, "wsgi.multiprocess": False, "wsgi.run_once": False}
4 | def start_response(status, headers, exc_info=None):
5 | captured["status"], captured["headers"] = status, headers
6 | body = flask_app(environ, start_response)
返回值类型: ClosingIterator | start_response 收到: 200 OK [('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '19')]
响应体(迭代 body): [b"hello 1 GET body=''"]
body 有 close 方法: True | callable(flask_app) = True上一篇:make_response() 的响应转换过程;下一篇:Flask 与 Werkzeug 的关系。第 7 篇看过 wsgi_app 的内部流程:请求进入 Flask 后的完整生命周期。
environ 键数: 18 | CONTENT_LENGTH = 7 | REQUEST_METHOD = POST run_wsgi_app → 200 OK | hello 2 POST body='payload'
app.wsgi_app = AddHeader(app.wsgi_app):X-Mw = on | a1 仍是 Flask: Flask | a1.config 可用: True wrapped = AddHeader(app):X-Mw = on | wrapped 的类型: AddHeader | wrapped 有 config: False
GET /hello?n=wsgiref → 200 hello wsgiref GET body='' | Server 头: WSGIServer/0.2 CPython/3.14.7
gunicorn wsgiapp:application → from application flask --app wsgiapp:application run → from application