究竟什么是Werkzeug?

109

根据官方文档

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 一样是一个Web服务器吗?

在第四行中,服务器提到了 Werkzeug ,但是 Werkzeug 到底是什么?它像 Apache 一样是一个Web服务器吗?

5个回答

182

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/ Python/。

这个服务器并不适用于生产环境。至少按照文档所说,它无法很好地扩展。但如果存在其他问题,比如安全性方面的问题,我也不会感到惊讶。


1
谢谢您提供的出色答案。我对这里的概念仍然有些困惑:我学到了WSGI是一个 web 服务器和 web 应用程序之间的中间层。那么在 Flask 中,如果 Werkzeug 充当简单的 Web 服务器(在开发中),那么谁充当 WSGI 中间层呢? - Kid_Learning_C
4
@Kid_Learning_C 还是Werkzeug。我不太确定是否应该称WSGI本身为一个层——更像是连接应用程序层和服务器层的规范。(再看一下答案中的要点:这就是WSGI。)Werkzeug可以替您处理WSGI的应用程序方面。但是,当您使用开发服务器时,它还会使用另一个模块来处理服务器端。 - Dominick Pastore

35

不,不是这样的。

Werkzeug(WSGI库)是您的Python代码和HTTP Nginx / Apache服务器之间的通信工具

以下是Werkzeug WSGI的完整用例:

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

在服务器与应用程序之间,可能存在WSGI中间件,该中间件实现了API的两个方面。服务器从客户端接收请求并将其转发给中间件。处理后,它向应用程序发送请求。应用程序的响应由中间件转发给服务器,最终转发给客户端。可能会有多个中间件形成符合WSGI的应用程序堆栈。

希望对您有所帮助。


19
因为不是这样设计的。
在你的设置中,你最可能使用“开发服务器”(run_simple函数)进行测试。因此,在这种情况下,它就像一个非常简陋的Apache,但只是能正确响应HTTP请求的意义上。
如果你查看文档http://werkzeug.pocoo.org/docs/serving/,你会看到以下说明:

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


16

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


1
有没有办法检查 Web 应用程序正在使用的确切服务器?我认为请求头应该在 Server: 行中显示服务器。 - jinglei
通常“服务器”标头上的信息是准确的。但请记住,如果有人想要隐藏这些信息,她可以轻松地更改该标头为任何她想要的内容(如果她是运行Web服务器的人)。 - Pablo Santa Cruz
1
在这种情况下,标题信息很可能是正确的。由于werkzeug附带了一个小型开发Web服务器 - 这可能是产生上述响应的原因。只有当OP更详细地解释他的设置时,我们才能确定。 - sebastian
8
Werkzeug不是CGI库,而是WSGI应用程序库。CGI和WSGI之间有很大的区别。 - Martijn Pieters
1
这是 Werkzeug Flask 开发服务器吗? - variable
@variable Werkzeug 是一个用于构建 Web 应用程序的工具集合。("Werkzeug" 这个词在德语中的字面意思是 "工具")。Flask 基本上只是围绕 Werkzeug 构建的更高级别的包装器,将这些工具组合成一个框架。Werkzeug 提供的工具之一是开发服务器,而 Flask 开发服务器与 Werkzeug 开发服务器是同一个。 - Rörd

-11

Flask Python使用Werkzeug作为Web服务器进行测试。


9
这个回答几乎没有什么用处。当然,与已经在这里的其他答案相比较而言。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接