【问题标题】:What exactly is Werkzeug?Werkzeug 到底是什么?
【发布时间】:2016-08-28 13:10:21
【问题描述】:

来自official documentation

Werkzeug 是一个用于 Python 的 WSGI 实用程序库。

但是,当我运行 Flask Web 应用程序时,我注意到来自服务器的响应标头包含:

HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 13
Server: Werkzeug/0.11.9 Python/2.7.10
Date: Tue, 03 May 2016 12:50:08 GMT

在第四行,服务器提到了Werkzeug,但Werkzeug 到底是什么,它是像Apache 这样的网络服务器吗?

【问题讨论】:

    标签: flask server wsgi werkzeug


    【解决方案1】:

    Werkzeug 主要是一个库,而不是 Web 服务器,尽管它确实为开发目的提供了一个简单的 Web 服务器。该开发服务器提供了 Server: 标头。

    更详细的:

    首先,让我们谈谈WSGI。那里有一堆 Web 服务器,如 Apache、Nginx、Lighttpd 等。还有一堆用 Python 编写的 Web 框架,例如Django、Flask、Tornado、Pyramid 等。如果这些都是可互操作的,那将非常方便。这就是 WSGI 的用武之地。想法是这样的:

    • 响应客户端的 HTTP 请求涉及两个方面:Web 服务器Web 应用程序。服务器处理复杂的网络连接、接收请求和发送响应。应用程序获取请求数据,对其进行操作,并制作响应以供服务器发回。

    • 如果要编写 Python Web 应用程序,请确保它有一个可调用对象(例如函数),该对象接受 HTTP 标头、输入表单数据、环境变量等的某些参数。

    • 如果您想编写一个为 Python 应用程序提供服务的 Web 服务器,请让它在每次 HTTP 请求进入时从应用程序调用该可调用对象。

    • WSGI 规范(在PEP 3333 中)准确地指定了该可调用的参数必须是什么以及返回值应该是什么,因此每个服务器都知道如何与每个应用程序通信,反之亦然。

    因此,我们知道每个 Web 应用程序都需要提供此可调用对象并能够处理它接收到的特定参数。 每个应用程序都需要这样做......这听起来像是使用库的好机会。 Werkzeug 就是这个库。

    Werkzeug 提供了一系列用于开发符合 WSGI 的应用程序的实用程序。这些实用程序执行诸如解析标头、发送和接收 cookie、提供对表单数据的访问、生成重定向、在出现异常时生成错误页面等操作,甚至提供在浏览器中运行的交互式调试器。它真的很全面。然后 Flask 在此基础上(以及 Jinja、Click 等)构建以提供完整的 Web 框架。

    那么,如果 Werkzeug 是一个用于应用程序的库,为什么它会出现在服务器标头中?

    Werkzeug 确实也有一个用于服务器角色的模块。这纯粹是为了方便。

    安装和配置像 Apache 或 Nginx 这样成熟的 Web 服务器需要付出很多努力,而且几乎可以肯定的是,仅仅为了在您自己的开发环境中测试您的应用程序就有些矫枉过正了。出于这个原因,Werkzeug 提供了一个开发服务器:一个简单的 Web 服务器,您可以使用单个命令运行,几乎不需要配置。当您执行flask run(或werkzeug.serving.run_simple())时,您将得到这个开发服务器。开发服务器的Server: 标头是——你猜对了——Werkzeug/<version> Python/<version>

    此服务器不适用于生产用途。至少,根据文档,它不能很好地扩展。但如果还有其他问题,例如安全性,我也不会感到惊讶。

    【讨论】:

    • 感谢您的出色回答。我对这里的概念仍然有些困惑:我了解到 WSGI 是 Web 服务器和 Web 应用程序之间的中间层。那么在flask中,如果workzeug作为一个简单的web服务器(在开发中),谁来作为WSGI中间层呢?
    • @Kid_Learning_C 它仍然是 Werkzeug。我不太确定我是否会将 WSGI 本身称为一个层——它更像是关于应用程序层和服务器层如何连接的规范。 (再看一下答案中的要点:那 is WSGI。)Werkzeug 为您处理 WSGI 的应用程序端。但是,当您使用开发服务器时,它使用附加模块处理服务器端。
    【解决方案2】:

    不,不是

    Werkzeug(WSGI 库)就像一个 你的 python 代码和 http nginx/apache 服务器之间的通信器

    这是 Werkzeug WSGI 的完整用例:

    WSGI 有两个方面:“服务器”或“网关”端(通常是 Web 服务器 例如 Apache 或 Nginx),以及“应用程序”或“框架”端 (Python 脚本本身)。为了处理 WSGI 请求,服务器端 执行应用程序并提供环境信息和 应用程序端的回调函数。申请流程 请求,使用 它提供了回调函数。

    在服务器和 应用程序,可能有一个 WSGI 中间件,它实现了两者 API 的各个方面。服务器收到客户端的请求,然后 将其转发给中间件。处理完成后,发送请求到 应用程序。应用程序的响应由 中间件到服务器,最终到客户端。可能有 多个中间件组成一堆符合 WSGI 的应用程序。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      因为不是。

      在您的设置中,您最有可能使用“开发服务器”(run_simple 函数)进行测试。 所以在这个用例中,它就像一个(非常)穷人的Apache,但只是在某种意义上它能够正确响应 HTTP 请求。

      如果您查看文档 http://werkzeug.pocoo.org/docs/serving/ ,您将看到以下注释:

      开发服务器不适用于生产系统。它专为开发目的而设计,在高负载下表现不佳。有关部署设置,请查看应用程序部署页面。

      【讨论】:

        【解决方案4】:

        不,它不是像 Apache 这样的 Web 服务器。这是一个 CGI 库。由于 Apache(或您的 Flask 应用程序)可能正在使用该库来处理一些 HTTP 请求,因此它可能会将该标头添加到响应中。

        【讨论】:

        • 是否有任何方法可以检查 Web 应用程序正在使用的确切服务器?我以为请求标头会在Server: 行中显示服务器。
        • 通常“服务器”标头上的内容是准确的。但请记住,如果有人想隐藏该信息,她可以轻松地将该标题更改为她想要的任何内容(如果她是运行 Web 服务器的人)
        • 在这种情况下,标题信息很可能是正确的。由于werkzeug 确实附带了一个小型开发网络服务器——这可能是产生上述响应的原因。我们只能确定 OP 是否更详细地解释了他的设置......
        • Werkzeug 不是 CGI 库。它是一个 WSGI 应用程序库。 CGI 和 WSGI 之间存在巨大差异。
        • 这个 werkzueg 是烧瓶开发服务器吗?
        【解决方案5】:

        Flask python 使用 werkzeurg 作为网络服务器进行测试

        【讨论】:

        • 这几乎不是一个有用的答案。当然与这里的其他答案相比。
        猜你喜欢
        • 1970-01-01
        • 2013-02-06
        • 2013-05-05
        • 2010-11-19
        • 2012-06-16
        • 2011-04-02
        • 2016-04-13
        • 2012-03-07
        • 2013-08-14
        相关资源
        最近更新 更多