什么是 WSGI :Python Web 服务器 和 Web 应用 之间的通信协议

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 作用

  1. 让 Web 服务器与 Web 框架/应用解耦
    • 服务器(Gunicorn、uWSGI)只需要遵循 WSGI 协议,就能运行各种 Python Web 应用。
    • Web 应用(Flask、Django)只需要符合 WSGI 规范,就能在多个服务器上运行。
  2. 提高 Web 应用的可移植性
    • 同一个 Flask/Django 应用,可以用 Gunicorn、uWSGI 或 mod_wsgi 运行,而不用修改代码。
  3. 处理 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 入口

总结

  1. WSGI 是 Python Web 服务器与应用之间的接口标准,类似于 Java 的 Servlet。
  2. Flask/Django 都基于 WSGI,可以运行在任何 WSGI 服务器上(Gunicorn、uWSGI)。
  3. WSGI 使得 Web 服务器和 Web 框架解耦,提升可移植性和兼容性。
  4. 生产环境下不会直接运行 Flask/Django 内置服务器,而是用 Gunicorn、uWSGI 等 WSGI 服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值