bigywater.tech
Flask · 13

WSGI Callable 的真实结构

WSGI 到底是什么接口?Flask 对象的真实结构是什么?能不能不借助任何服务器就调用它?这篇从 environ 与 start_response 开始,一层层验证。

2
WSGI callable 的参数个数(environ、start_response)
18
EnvironBuilder 生成的 environ 键数
wsgiref
本篇用来运行 Flask 对象的标准库 WSGI 服务器

直接调用 Flask 对象

实测 · 本机执行输出
  源码:
      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 后的完整生命周期。

EnvironBuilder

实测 · 本机执行输出
  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

wsgiref 服务器

实测 · 本机执行输出
  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

分步演示

WSGI 应用
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:uWSGI 的 module= 写法(见第 173 篇)、WSGI 规范里 start_response 的 exc_info 与 write 回调、environ 里 wsgi.file_wrapper 的作用、生成器响应在 close 时的资源释放顺序
    京ICP备2026067502号-1京公网安备11010502063487号