12

正如我在标题中所说,我目前对它们的基本理解感到非常不舒服。

据我所知,mod_wsgi 实现了可以在 Apache Web 服务器下运行的 WSGI 规范。

它是用 C 语言编写的。

另一个,werkzeug 是一种工具包,具有有用的实用程序。我还回顾了 werkzeug 可以运行在其源中实现的简单服务(serving.py 中的 make_server)。我知道 werkzeug 具有有用的功能和简单的服务器功能。

我想知道的如下。

在 Apache Web 服务器下使用基于 werkzeug 的类似 Flask 的框架时,mod_wsgi 究竟做了什么?

werkzeug 还有基本的 http 服务器功能,不需要 mod_wsgi 支持。

谁能解释 mod_wsgi 和 werkzeug 之间的区别?

mod_wsgi 和 werkzeug 从 Web 服务器的角度来看具有重复的功能。

4

2 回答 2

26

WSGI 代表 Web 服务器网关接口,(大部分)由 PEP 333 在http://www.python.org/dev/peps/pep-0333/定义。

Python 社区努力为 Web 服务器建立与 Python 应用程序对话的标准机制。

理论上,任何 wsgi 兼容的服务器(或现有 Web 服务器的扩展)都应该能够加载和运行任何 wsgi 兼容的应用程序。

werkzeug是一个 Web 应用程序框架,可以在兼容的 WSGI 服务器下运行,例如 Apache+mod_wsgi。它还包含一个可用于开发的内置开发服务器。


WSGI 一开始可能会让人很困惑,但实际上它非常简单。WSGI 规范要求您的 python 应用程序执行以下操作:

  1. 定义一个名为application
  2. 说 callable 应该接受 2 个参数: ( environ, start_response)
  3. environ是环境变量的字典
  4. start_response是一个可调用对象,需要调用才能开始响应

一旦application被调用,它就会处理请求,构建输出,然后:

  1. 来电start_response('200 OK', Headers)
  2. return [content]

一个简单的 WSGI 应用程序可能如下所示:

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

强烈建议您使用现有的 WSGI 框架,因为在解析 HTTP 请求、处理文件上传、编码字符等方面涉及很多细节......

看看 Bottle、Flask、werkzeug、AppStruct 等...

于 2012-10-02T04:37:58.930 回答
14

mod_wsgi是一个兼容 wsgi 的 python 模块,它连接了 python 和 apache。它允许您在 apache 下运行编码为 wsgi 规范的应用程序。

werkzeug是一个 wsgi 实用程序库,用于构建 wsgi 兼容的应用程序。它附带一个开发服务器。

有一些 Python Web 应用程序框架:Pyramid/Pylons、Flask、Bottle、Django、CherryPy 等。它们都实现了 WSGI 规范,这是用 Python 构建 Web 应用程序的事实标准(http:// en.wikipedia.org/wiki/Web_Server_Gateway_Interface

大多数 Web 应用程序框架都附带一个仅可调试或具有生产能力的 Web 服务器。当您拥有 WSGI 应用程序时,您可以通过库的应用程序、通过 Apache 通过 Apachemod_wsgi或使用“纯”wsgi 服务器(如uWSGIgunicornfapwstwisted.

我认识的大多数人都会像这样部署一个 wsgi 应用程序:

  • 一个轻量级的服务器,比如 nginx,监听 port80
  • 轻量级服务器本身提供静态文件
  • 轻量级服务器将 uWSGI 请求代理到另一个服务器,这通常是 uWSGI,但有时是 apache+mod_wsgi 或其他。根据设置,代理可以是 http 代理,也可以直接或通过套接字连接到 uWSGI 服务器。

话虽如此,要具体回答您的问题,请阅读此文档页面的第一段 - http://werkzeug.pocoo.org/docs/serving/

有很多方法可以为 WSGI 应用程序提供服务。在开发它时,您通常不希望有一个像 Apache 这样成熟的网络服务器启动并运行,而是一个简单的独立网络服务器。因此,Werkzeug 带有一个内置的开发服务器。

出于开发原因,或者在流量非常低的站点上,您可以只使用 Werkzeug 服务器。如果您正在部署一个能够获得合理流量的应用程序,您将需要更健壮的东西。

mod_wsgi 或 uWSGI 复制了 Werkzeug 的服务特性,但他们这样做是因为他们可以做得更好——更快的响应时间、更低的内存、更好的并发性、更稳定等等等等等等。Werkzeug 服务器对于许多用途来说“足够好” ,但它不是为符合 wsgi 的应用程序提供服务的“最佳方式”。

于 2012-10-02T05:06:50.693 回答