WSGI(Web Server Gateway Interface)是什么?
WSGI(Web Server Gateway Interface) 是 Python Web 服务器 和 Web 应用 之间的通信协议,定义了 Web 服务器 如何与 Python Web 框架(如 Flask、Django) 进行交互。
WSGI 由 PEP 3333 标准化,使得 Python Web 服务器(如 Gunicorn、uWSGI)可以运行任何支持 WSGI 的 Python Web 应用(如 Flask、Django),从而解耦服务器和应用,使它们可以独立开发和替换。
WSGI 作用
- 让 Web 服务器与 Web 框架/应用解耦:
- 服务器(Gunicorn、uWSGI)只需要遵循 WSGI 协议,就能运行各种 Python Web 应用。
- Web 应用(Flask、Django)只需要符合 WSGI 规范,就能在多个服务器上运行。
- 提高 Web 应用的可移植性:
- 同一个 Flask/Django 应用,可以用 Gunicorn、uWSGI 或 mod_wsgi 运行,而不用修改代码。
- 处理 HTTP 请求和响应:
- 服务器接收 HTTP 请求后,转换为 WSGI 兼容的格式,交给 Python 应用处理,再将响应返回给客户端。
WSGI 的基本工作流程
1. 服务器端(Gunicorn/uWSGI)
- 监听 HTTP 请求
- 解析请求数据,转换为 WSGI 格式
- 调用 WSGI 应用(Flask/Django)
- 获取应用返回的 HTTP 响应,发送回客户端
2. 应用端(Flask/Django)
- 服务器调用 WSGI 入口函数
- 解析请求(如
environ
) - 处理业务逻辑,生成 HTTP 响应
- 返回响应给 WSGI 服务器
WSGI 示例
一个最简单的 WSGI 应用:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b"Hello, WSGI!"]
解释:
environ
:包含 HTTP 请求的信息(如 URL、Headers)。start_response
:用于返回 HTTP 响应状态和头部信息。return
:返回 HTTP 响应体(必须是 字节类型)。
用 Gunicorn 运行
如果保存为 app.py
,可以运行:
gunicorn app:application
Flask 应用中的 WSGI
在 Flask 中,app
本身就是一个 WSGI 兼容的应用:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Flask!"
if __name__ == "__main__":
app.run()
app.run()
启动 Flask 内置服务器(仅用于开发)。- 在生产环境中,我们用 Gunicorn 来运行:
这里的gunicorn -w 4 -b 0.0.0.0:8000 app:app
app:app
表示:app.py
:Python 文件名。app
:Flask 应用对象,即 WSGI 入口。
总结
- WSGI 是 Python Web 服务器与应用之间的接口标准,类似于 Java 的 Servlet。
- Flask/Django 都基于 WSGI,可以运行在任何 WSGI 服务器上(Gunicorn、uWSGI)。
- WSGI 使得 Web 服务器和 Web 框架解耦,提升可移植性和兼容性。
- 生产环境下不会直接运行 Flask/Django 内置服务器,而是用 Gunicorn、uWSGI 等 WSGI 服务器。