当前位置: 首页 > article >正文

Flask、Werkzeug 和 WSGI 间的关系

一.Flask、Werkzeug和 WSGI 关系

1.WSGI Web 架构

Flask 是一个基于 Werkzeug 和 Jinja2 模板引擎的轻量级 Web 框架。Werkzeug 是 Flask 的底层 WSGI 工具包,它提供了 WSGI 服务器、请求和响应对象、路由等基础功能,Flask 在此基础上构建了更高级的 Web 框架功能。

2.Werkzeug简单示例

        Werkzeug可理解为WSGI开发服务器,使用 flask run 命令时,Flask 会启动一个基于 Werkzeug 的开发服务器。因此在用PyCharm调试Flask应用程序时,在Console会有WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.提示。
        Werkzeug的开发服务器提供了方便的调试功能,如自动重新加载代码更改,以及详细的错误页面,这些特性使得它成为开发过程中非常有用的工具。同时,Werkzeug还提供了请求和响应对象、实用的URL路由、中间件、测试客户端等,这些都极大地简化了Web应用的开发过程。
        使用 Werkzeug 创建一个基本 Web 应用程序的简单示例,如下所示:

from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple

def application(environ, start_response):
    request = Request(environ)
    response = Response(f'Hello, {request.args.get("name", "World")}!')
    return response(environ, start_response)

if __name__ == '__main__':
    run_simple('localhost', 4000, application)

二.Werkzeug、Gunicorn 和 uWSGI 关系

Werkzeug 通常用于开发环境,因为它简单易用。Gunicorn 和 uWSGI 用于生产环境,服务于使用 Flask 等框架创建的 WSGI 应用程序(Flask 底层使用 Werkzeug)。

1.WSGI 介绍

(1)Werkzeug:一个用于 Python 的 WSGI 工具库,提供了创建和管理 WSGI 应用程序的工具。它包括一个简单的 WSGI 服务器,适用于开发环境。

(2)Gunicorn:一个用于 UNIX 的 Python WSGI HTTP 服务器。它采用预分叉工作模式,即分叉多个工作进程来处理请求。它设计用于生产环境,可以服务于 WSGI 应用程序。

(3)uWSGI:一个用于托管 Python Web 应用程序的全栈服务器。它支持多种协议,包括 WSGI,并且高度可配置。它也设计用于生产环境,可以服务于 WSGI 应用程序。

2.使用示例

(1)使用 Flask 和 Gunicorn

-w 4 这个选项设置了服务器的工作进程数为 4。Gunicorn 使用多进程模型,每个工作进程可以处理一个请求,设置多个工作进程可以提高服务器的并发处理能力。

gunicorn -w 4 myapp:app

(2)使用 Flask 和 uWSGI

该命令将启动一个 uWSGI 服务器,它将监听 9090 端口,运行 myapp.py 文件中的 app 对象,并使用 4 个进程和每个进程 2 个线程来处理并发的 HTTP 请求。这样的配置适合于生产环境,可以提供比开发服务器更高的性能和稳定性。

uwsgi --http :9090 --wsgi-file myapp.py --callable app --processes 4 --threads 2

三.生产环境 Gunicorn 和 Werkzeug 关系

如果生产环境使用 Gunicorn,那么 Werkzeug 还有什么作用呢?简单理解,Gunicorn 负责请求的接收和分发,而 Werkzeug 负责处理应用程序内部的 HTTP 请求与响应逻辑,二者互相协作。

1.开发工具包

Werkzeug 提供了许多有用的开发工具,如调试器和带有详细错误追踪的开发服务器。在开发环境中,Werkzeug 的开发服务器通常用于快速运行应用程序以进行调试,而生产环境则使用 Gunicorn。

2.请求和响应对象的处理

Werkzeug 仍然是 Flask 等框架的底层请求处理工具。即使在生产环境中使用 Gunicorn 处理 HTTP 请求,Gunicorn 依然会通过 Flask 使用 Werkzeug 来解析请求对象、构造响应对象、处理 cookies、URL 路径等。

3.路由和 URL 规则管理

Werkzeug 负责处理应用程序的 URL 路由规则。它管理 URL 的解析和调度,即使使用 Gunicorn 作为服务器,Werkzeug 仍然参与 URL 路径匹配和路由。

4.中间件支持

Werkzeug 提供了一些 WSGI 中间件,用于增强应用程序功能。例如,它可以提供代理支持、会话管理等,这些功能在生产环境中仍然有用。

参考文献

[1] Flask 初版架构源码解读:https://developer.aliyun.com/article/926601

[2] Flask 源码阅读计划:https://wiki.masantu.com/flask-insight-introduction

[3] Flask 源码篇:wsgi、Werkzeug 与 Flask 启动工作流程:https://blog.csdn.net/qq_43745578/article/details/129272779

NLP工程化(星球号)


http://www.kler.cn/a/312018.html

相关文章:

  • Python高级编程模式和设计模式
  • npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系
  • 比ChatGPT更酷的AI工具
  • acwing算法基础02一高精度,前缀和,差分
  • MySQL重难点(一)索引
  • LLMs 如何处理相互矛盾的指令?指令遵循优先级实验
  • 代码随想录算法训练营第三十二天 | 509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
  • PHP 实现 redis 分布式锁
  • 中间件安全(二)
  • 作品集生成链接或二维码:设计师求职
  • 数据结构和算法之线性结构
  • Java中Integer的缓存池是怎么实现的?
  • 旧系统迁移新框架:FastAPI 的 WSGIMiddleware 让过程变得简单
  • 松材线虫无人机数据集——20731个,已人工标注出来的样本【深度学习样本】
  • 【Leetcode:2848. 与车相交的点 + 模拟计数】
  • Java | Leetcode Java题解之第413题等差数列划分
  • 最新!综合性SCI期刊汇总!《NATURE》位居榜首~
  • 大数据基础架构技术栈一览
  • Redis 的三个并发问题及解决方案(面试题)
  • 【AI大模型】ChatGPT模型原理介绍(下)
  • Redis 执行 Lua,能保证原子性吗?
  • 深入解析 JVM 中静态块、静态属性、构造块与构造方法的执行顺序
  • Vue2项目升级攻略:如何更新package.json中的依赖
  • WPF 中的线程池
  • 阿里云盘照片事件!网络安全警钟长鸣
  • 网站采用H5+CSS3开发的优势和劣势