什么是简单英语的WSGI和CGI?

Bla*_*man 118 python cgi wsgi

每当我读WSGI或CGI时,我都会感到畏缩.我之前尝试过阅读,但没有真正陷入困境.

用简单的英语真的是什么?

它只是将请求传递给终端并重定向输出吗?

Mar*_*ood 234

从完全后退的角度来看,布兰克曼,这是我的Web服务网关接口的"简介页":

第一部分:WEB服务器

Web服务器提供响应.他们坐在那里,耐心等待,然后一点也没有警告,突然:

  • 客户端进程发送请求.客户端进程可以是Web服务器,机器人,移动应用程序等等.它只是"客户"
  • Web服务器接收此请求
  • 故意喃喃自语各种事情发生(见下文)
  • Web服务器将一些内容发送回客户端
  • 网络服务器再次坐下来

Web服务器(至少是更好的服务器)非常非常擅长这一点.他们根据需求进行扩大和缩小处理,他们可靠地与最肮脏的客户进行对话,而不是真正的网络,我们从来没有真正担心它.他们只是继续服务.

这是我的观点:Web服务器只是:服务器.他们对内容一无所知,对用户一无所知,事实上除了如何等待和可靠回复之外什么都没有.

您选择的Web服务器应该反映您的交付偏好,而不是您的软件.您的Web服务器应该负责服务,而不是处理或逻辑内容.

第二部分:(PYTHON)软件

软件不会坐着.软件仅在执行时存在.当涉及到环境中的意外变化(文件不在预期的位置,重命名的参数等)时,软件并不十分容易.虽然优化应该是您设计的核心原则(当然),但软件本身并不优化.开发人员优化.软件执行.软件会在上面的"故意嘟嘟"部分中完成所有内容.可能是什么.

您选择或设计的软件应该反映您的应用程序,您选择的功能,而不是您选择的Web服务器.

这就是传统的"编译"语言到Web服务器的方法变得痛苦的地方.您最终会在应用程序中放置代码以应对物理服务器环境,或者至少被迫选择适当的"包装"库以在运行时包含,以便在Web服务器之间产生一致性的错觉.

什么是WSGI?

那么,最后,什么是WSGI?WSGI是一组规则,分为两部分.它们的编写方式使它们可以集成到任何欢迎集成的环境中.

第一部分是为Web服务器端编写的,"好的,如果你想处理一个WSGI应用程序,这就是软件在加载时的思考方式.以下是你必须为应用程序提供的东西,在这里是你可以期望每个应用程序都具有的接口(布局).此外,如果出现任何问题,这里是应用程序将如何思考以及如何期望它的行为."

第二部分是为Python应用程序软件编写的,"好的,如果你想处理一个WSGI服务器,这就是服务器在与你联系时的想法.以下是你必须提供给服务器的东西,以及这里是你可以期望每个服务器都有的接口(布局).而且,如果出现任何问题,这就是你应该如何表现,这就是你应该告诉服务器的内容."

所以你有它 - 服务器将是服务器,软件将是软件,这是一种他们可以相处得很好的方式,而不必为另一方的细节做出任何限制.这是WSGI.

另一方面,mod_wsgi是Apache的一个插件,它允许它与WSGI兼容的软件进行通信,换句话说,mod_wsgi是一个实现 - 在Apache中 - 是上述规则手册第一部分的规则.

至于CGI ....问别人:-)

  • 我希望有人能够以同样的方式编辑这个答案以包含CGI,而不是让这个答案以"问别人"结束. (17认同)

Ign*_*ams 59

WSGI在Web服务器启动时运行Python解释器,作为Web服务器进程(嵌入模式)的一部分或作为单独的进程(守护进程模式)运行,并将脚本加载到其中.每个请求都会在调用的脚本中生成一个特定的函数,请求环境作为参数传递给函数.

CGI将脚本作为单独的进程运行每个请求,并使用环境变量,stdin和stdout与其"通信".

  • WSGI!= mod_wsgi.你的语言暗示你的意思是mod_wsgi,它是WSGI的一个实现.WSGI本身仅仅是一个规范,可以通过许多不同的方式实现,包括在CGI之上. (14认同)
  • 从技术上讲,人们可以说存在比这两者更微妙的变化,至少与过程如何开始或如何在嵌入式系统中激活代码一样多.因此,只需要谨慎地将事物推广到这两个类别中.在粗略的层面上,你可能会说你拥有的东西,但如果你想深入研究它,还有更多的东西. (2认同)
  • 阅读 WSGI 规范。它显示了一个示例 CGI/WSGI 桥。https://www.python.org/dev/peps/pep-3333/#the-server-gateway-side 有关更健壮的实现,请参阅 https://github.com/GrahamDumpleton/cgi2wsgi 不过说真的,一般来说你会想避免 CGI。 (2认同)

Ric*_*man 19

如果你不清楚这个领域的所有术语,让我们面对它,这是一个令人困惑的首字母缩略词,还有一个很好的背景阅读器,形式为官方python HOWTO,讨论CGI与FastCGI对比WSGI等等.上.我希望我先读它.


Woo*_*ble 18

CGI和WSGI都定义了程序可用于处理Web请求的标准接口.CGI接口的级别低于WSGI,并且涉及服务器设置包含来自HTTP请求的数据的环境变量,程序返回的格式非常类似于裸HTTP服务器响应.

另一方面,WSGI是一个特定于Python的稍高级别的接口,它允许程序员编写与服务器无关且可以包装在其他WSGI应用程序(中间件)中的应用程序.