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

use*_*464 10 python mod-wsgi wsgi werkzeug

正如我在标题上所说,我现在对基本了解它们感到非常不舒服.

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

它用C语言编写.

另外一个,werkzeug是一种具有实用功能的工具包.我还评论过werkzeug可以运行在其源代码中实现的简单服务(serve.server在serve.py中).我知道werkzeug具有有用的功能和简单的服务器功能.

我想知道的是下面的内容.

当在Apache Web服务器下使用基于werkzeug的Flask框架时,mod_wsgi到底做了什么?

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

任何人都可以解释mod_wsgi和werkzeug之间的区别吗?

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

gah*_*ooa 22

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

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

看看Bottle,Flask,werkzeug,AppStruct等......


Jon*_*sco 13

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通过mod_wsgi,或使用"纯" WSGI服务器一样uWSGI,gunicorn,fapws,或twisted.

我认识的大多数人都会像这样部署一个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兼容应用程序的"最佳方式".

  • 关于uWSGI的一点混乱在这里.该包称为uWSGI(已更正).uWSGI用于在Web服务器(nginx或Apache)之间进行通信的内部协议称为uwsgi(小写).尽管协议名称中包含'wsgi',但它实际上与WSGI没有任何关系,并且实际上是与SCGI协议非常相似的有线协议.uWSGI甚至都不是一个"纯粹的"WSGI服务器.实际上你正在使用的是uWSGI的Python插件,其中uWSGI包实际上支持使用非WSGI适配器的其他语言.全面的名字选择不当. (4认同)
  • 格雷厄姆说的一切都是+1.对不起,如果我对此产生了一些困惑 - 无意识. (2认同)