当前位置:  开发笔记 > 编程语言 > 正文

Python Web框架,WSGI和CGI如何组合在一起

如何解决《PythonWeb框架,WSGI和CGI如何组合在一起》经验,为你挑选了4个好方法。

我有一个Bluehost帐户,我可以在其中运行Python脚本作为CGI.我想这是最简单的CGI,因为要运行我必须在以下内容中定义.htaccess:

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

现在,每当我使用Python查找Web编程时,我都会听到很多关于WSGI以及大多数框架如何使用它的信息.但我只是不明白它是如何组合在一起的,特别是当我的Web服务器被给出时(Apache在主机的机器上运行)而不是我真正可以玩的东西(定义.htaccess命令除外).

WSGI,CGI和框架是如何连接起来的?如果我想在我的基本CGI配置上运行Web框架(比如web.py或CherryPy),我需要知道,安装和执行什么操作?如何安装WSGI支持?



1> S.Lott..:

WSGI,CGI和框架是如何连接的?

Apache侦听端口80.它获取HTTP请求.它解析请求以找到响应方式.Apache有很多响应选择.一种回应方式是使用CGI来运行脚本.另一种回应方式是简单地提供文件.

在CGI的情况下,Apache准备一个环境并通过CGI协议调用脚本.这是标准的Unix Fork/Exec情况 - CGI子进程继承了包含socket和stdout的OS环境.CGI子进程编写一个响应,返回给Apache; Apache将此响应发送到浏览器.

CGI是原始的,令人讨厌的.主要是因为它为每个请求分配一个子进程,并且子进程必须退出或关闭stdout和stderr以表示响应结束.

WSGI是一个基于CGI设计模式的接口.它不一定是CGI - 它不必为每个请求分叉子进程.它可以是CGI,但它不一定是.

WSGI以几种重要方式增加了CGI设计模式.它为您解析HTTP请求标头并将其添加到环境中.它提供任何面向POST的输入作为环境中的类文件对象.它还为您提供了一个能够制定响应的功能,从而避免了大量的格式化细节.

如果我想在我的基本CGI配置上运行Web框架(比如web.py或cherrypy),我需要知道/安装/做什么?

回想一下,分支子进程很昂贵.有两种方法可以解决这个问题.

    嵌入 mod_wsgimod_python嵌入Apache内部的Python; 没有进程分叉.Apache直接运行Django应用程序.

    守护进程 mod_wsgimod_fastcgi允许Apache使用WSGI协议与单独的守护进程(或"长时间运行的进程")进行交互.您启动长期运行的Django进程,然后配置Apache的mod_fastcgi以与此进程通信.

请注意,它mod_wsgi可以在任何模式下工作:嵌入式或守护进程.

当您阅读mod_fastcgi时,您会看到Django使用flup从mod_fastcgi提供的信息中创建一个WSGI兼容的接口.管道就是这样的.

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)

Django为各种接口提供了几个"django.core.handlers".

对于mod_fastcgi,Django提供了一个manage.py runfcgi集成FLUP和处理程序的东西.

对于mod_wsgi,有一个核心处理程序.

如何安装WSGI支持?

请遵循这些说明.

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

有关背景,请参阅此处

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index


S.Lott,而不是抱怨当人们问哪个"更好"时,为什么不简单地说"mod_wsgi更好X,fastcgi更好Y",如果OP有更具体的问题,他们会问.
@Greg Lind:为什么不简单地声明"mod_wsgi更好X,fastcgi更适合Y"?因为它不是很容易做到的.有许多非功能性质量因素是X和Y集的元素.很难一一列举它们.对于那些询问有关质量因素的具体问题,人们要好得多.
我无法安装mod_wsgi因为我在共享主机上.我所拥有的只是fcgi支持.我怎样才能通过它运行WSGI应用程序?
+1这是一个很好的答案,并回答了我想到的很多(但不是全部)问题.这个答案仍然不完整.您对CGI和WSGI有很好的解释,但是FASTCGI和WSGI之间的关系和差异是什么?哪个更好?他们是如何工作的?mod_python是如何进入图片的?
仅供注释:自1.7版本以来,不推荐使用runfcgi选项,并且在Django 1.9中删除了FastCGI支持.

2> James Brady..:

我认为弗洛里安的答案回答了关于"什么是WSGI"的问题部分,特别是如果您阅读了PEP.

至于你在最后提出的问题:

WSGI,CGI,FastCGI等都是Web服务器运行代码的协议,并提供生成的动态内容.将此与静态Web服务进行比较,其中纯HTML文件基本上按原样传递给客户端.

CGI,FastCGI和SCGI是语言无关的.你可以用Perl,Python,C,bash等编写CGI脚本.CGI 根据URL 定义将调用哪个可执行文件,以及如何调用它:参数和环境.它还定义了在可执行文件完成后如何将返回值传递回Web服务器.这些变化基本上是优化,能够处理更多请求,减少延迟等等; 基本概念是一样的.

WSGI只是Python.标准函数签名定义为标准函数签名,而不是语言不可知协议:

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

这是一个完整的(如果有限的)WSGI应用程序.支持WSGI的Web服务器(例如带有mod_wsgi的Apache)可以在请求到达时调用此函数.

这是如此之大的原因是我们可以避免从HTTP GET/POST转换为CGI到Python的混乱步骤,并在出路时再次返回.这是一个更加直接,清洁和高效的联系.

如果所有需要为请求完成的操作都是函数调用,那么在Web服务器后面运行长时间运行的框架也会更容易.使用简单的CGI,您必须为每个单独的请求启动整个框架.

要获得WSGI支持,您需要安装WSGI模块(如mod_wsgi),或者使用带有WSGI的Web服务器(如CherryPy).如果这些都不可能,您可以使用PEP中给出的CGI-WSGI桥.


是什么愚蠢的想法是不让WSGI语言不可知?那有什么意义呢?不妨将整个Python作为Apache模块发布.
@SalmanPK我认为这只是一个权衡.当然,制作一种语言无关的协议并不容易(如果不是不可能),只需用所选语言实现一个功能即可使用该协议.

3> Florian Bösc..:

您可以通过CGI运行WSGI,例如Pep333演示.但是,每次有请求时,都会启动一个新的Python解释器,并且需要构建整个上下文(数据库连接等),这些都需要时间.

如果你想运行WSGI,最好的办法是你的主机安装mod_wsgi并进行适当的配置以将控制权推迟到你的应用程序.

Flup是使用WSGI运行任何可以说FCGI,SCGI或AJP的网络服务器的另一种方式.根据我的经验,只有FCGI真的有用,它可以通过mod_fastcgi在Apache中使用,或者如果你可以用mod_proxy_fcgi运行一个单独的Python守护进程.

WSGI是一个非常类似于CGI的协议,它定义了一组规则,即webserver和Python代码之间的交互方式,它被定义为Pep333.它使许多不同的Web服务器可以使用相同的应用程序协议来使用许多不同的框架和应用程序.这非常有益,并且非常有用.


在CGI上运行WSGI是什么"flup"用于?flup如何与该计划相关联?

4> Richard Boar..:

如果你不清楚这个领域的所有术语,让我们面对它,它是一个令人困惑的首字母缩略词,那么还有一个很好的背景阅读器,形式为官方python HOWTO,讨论CGI与FastCGI对比WSGI等等. on:http://docs.python.org/howto/webservers.html


URL已过时,我认为这是更新的地址:https://docs.python.org/2.7/howto/webservers.html
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有