你能解释一下 mod_wsgi 和 werkzeug 之间更详细的区别吗? (求救新手)

Posted

技术标签:

【中文标题】你能解释一下 mod_wsgi 和 werkzeug 之间更详细的区别吗? (求救新手)【英文标题】:Could you explain more detailed differences between mod_wsgi and werkzeug? (SOS newbies) 【发布时间】:2012-09-22 23:10:04 【问题描述】:

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

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

它是用 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 服务器的角度来看具有重复的功能。

【问题讨论】:

Django不是基于werkzeug的,你是说Flask吗? 哦,抱歉我的知识不足。任何基于 werkzeug 的框架。烧瓶也是。我会编辑。谢谢 我认为像 django 一样,他们建议只在开发环境中使用 runserver 或其他任何东西,而不是在生产环境中......大多数主机你不能运行长时间运行的进程,所以你使用 mod_wsgi 或乘客来托管 【参考方案1】:

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

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

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

大多数 Web 应用程序框架都附带一个仅可调试或具有生产能力的 Web 服务器。当你有一个 WSGI 应用程序时,你可以通过库的应用程序提供服务,通过 Apache 通过 mod_wsgi,或使用像 uWSGIgunicornfapwstwisted 这样的“纯”wsgi 服务器。

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

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

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

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

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

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

【讨论】:

这里对 uWSGI 有点困惑。该软件包称为 uWSGI(已更正)。 uWSGI 用于在 Web 服务器(nginx 或 Apache)之间进行通信的内部协议称为 uwsgi(小写)。尽管该协议名称中有“wsgi”,但它实际上与 WSGI 规范没有任何关系,实际上是一个与 SCGI 协议非常相似的有线协议。 uWSGI 甚至不是一个“纯”的 WSGI 服务器。实际上,您使用的是 uWSGI 的 Python 插件,其中 uWSGI 包实际上支持使用非 WSGI 适配器的其他语言。名称选择错误。 +1 格雷厄姆所说的一切。抱歉,如果我对此造成了一些混乱 - 无意。【参考方案2】:

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 应用程序执行以下操作:

    定义一个名为application的可调用对象 说callable应该接受2个参数:(environ, start_response) environ 是环境变量字典 start_response 是一个可调用对象,需要调用它来启动响应

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

    致电start_response('200 OK', Headers) 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 等...

【讨论】:

感谢您的详细解释。我可以画出基本的概念。我将尝试深入研究框架。 那么 werkzeug 是 WSGI 参考实现吗?

以上是关于你能解释一下 mod_wsgi 和 werkzeug 之间更详细的区别吗? (求救新手)的主要内容,如果未能解决你的问题,请参考以下文章

你能解释一下提供的例子中的分类报告(召回率和精度)吗?

你能解释一下这段代码的作用吗?

你能解释一下 lambda 表达式吗? [复制]

你能解释一下输出并指出错误吗

你能解释一下为啥 DirectoryInfo.GetFiles 会产生这个 IOException 吗?

你能解释一下何时以及为啥在 hive 中调用 mapreduce