Werkzeug到底是什么?


78

官方文档中

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

在第四行中,服务器提到a Werkzeug,但Werkzeug实际上是Web服务器Apache吗?

Answers:


14

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


是否有任何方法可以检查Web应用程序正在使用的服务器?我以为请求标头会显示服务器的Server:行。
静蕾

通常,“服务器”标头上的内容是正确的。但是请记住,如果某人想要隐藏该信息,则可以轻松地将该标头更改为所需的任何内容(如果她是运行Web服务器的那个人)
Pablo Santa Cruz

在这种情况下,标头信息很可能是正确的。因为werkzeug确实附带了一个小型开发Web服务器-可能是产生以上响应的原因。我们只能确定OP是否会更详细地解释他的设置...
sebastian

3
Werkzeug不是CGI库。这是WSGI应用程序库。CGI和WSGI之间存在巨大差异。
马丁·彼得斯

这是werkzueg烧瓶开发服务器吗?
可变

107

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的确有一个服务器角色模块。这纯粹是为了方便起见。

安装和配置功能完善的Web服务器(例如Apache或Nginx)需要付出很多努力,并且几乎可以肯定,仅在您自己的开发箱上测试您的应用程序就显得过头了。因此,Werkzeug提供了一个开发服务器:一个简单的Web服务器,您只需一个命令即可运行,几乎不需要配置。当您flask run(或werkzeug.serving.run_simple())执行此操作时,您将获得此开发服务器。Server:您猜到了,开发服务器的标头是Werkzeug/<version> Python/<version>

该服务器不适合生产使用。至少,根据文档,它的伸缩性不好。但是,如果还有其他顾虑,例如安全性,我也不会感到惊讶。


30

不,不是

Werkzeug(WSGI库)就像您的python代码和http nginx / apache服务器之间的交流者

这是Werkzeug WSGI的完整用例:

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

在服务器和应用程序之间,可能有一个WSGI中间件,该中间件实现了API的两侧。服务器从客户端接收请求,并将其转发到中间件。处理后,它将请求发送到应用程序。中间件将应用程序的响应转发到服务器,最后转发给客户端。可能有多个中间件构成了WSGI兼容应用程序的堆栈。

希望能帮助到你


17

因为不是。

在您的设置中,您最有可能使用“开发服务器”(该run_simple功能)进行测试。因此,在这种用例中,就像(很)穷人一样Apache,只是在某种意义上说它能够正确回答HTTP请求。

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

开发服务器不打算在生产系统上使用。它是专为开发目的而设计的,在高负载下性能较差。对于部署设置,请查看“应用程序部署”页面。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.