Werkzeug究竟是什么?

jin*_*lei 42 wsgi werkzeug flask server

官方文件说:

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
Run Code Online (Sandbox Code Playgroud)

在第四行它说服务器是Werkzeug.

为什么这不是Werkzeug一个像Web服务器那样的意思Apache

Nic*_*ick 33

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>

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

  • @Kid_Learning_C 它仍然是 Werkzeug。我不太确定是否会将 WSGI 称为一个层 - 它更像是应用程序层和服务器层如何连接的规范。(再看一下答案中的要点:那就是 WSGI。)Werkzeug 为您处理 WSGI 的应用程序端。但是,当您使用开发服务器时,它“也”使用附加模块来处理服务器端。 (2认同)

Muh*_*man 24

不,不是

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

以下是Werkzeug WSGI的完整用例:

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

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

希望能帮助到你


seb*_*ian 12

因为事实并非如此.

在您的设置中,您最有可能使用"开发服务器"(该run_simple功能)进行测试.所以它在这个用例中就像一个(非常)穷人Apache,但只是在某种意义上说它能够正确回答HTTP请求.

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

开发服务器不适用于生产系统.它专为开发目的而设计,在高负载下性能很差.对于部署设置,请查看"应用程序部署"页面.


Pab*_*ruz 6

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

  • Werkzeug 不是 CGI 库。它是一个 WSGI 应用程序库。CGI 和 WSGI 之间存在巨大差异。 (5认同)