2012-03-12 62 views
2

我有一个几乎完整的简单的网络应用程序被编写为Python CGI脚本。我想将其改为使用WSGI,但我无法找到帮助我理解WSGI实际是什么的文档(只能通过start_response等方式重复查找调用,但似乎没有太多的解释呼叫实际上是)。有人能指点我一个很好的解释,再加上关于如何使用WSGI?需要一个好的初学者的WSGI指南

编辑:补充一点,我见过this question但答案似乎仍然不能告诉一个如何在直接脚本中使用WSGI(如在一个框架反对)。

+0

哎呀,我刚刚发现[本指南来自Armin Ronacher](http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/),这似乎是我一直在寻找。也推荐给其他人。我认为,不能克服这个问题,所以要求其他人这样做。 – ShankarG 2012-03-12 08:58:47

回答

8

WSGI是PEP 333(和Python3的PEP3333),也叫做Web服务器网关接口。它有三个部分,但您感兴趣的部分是您如何编写WSGI应用程序。 WSGI应用程序是一个可调用的对象,它接受两个参数并返回一个可迭代的对象(或者是一个生成器)。

# this is my_app module 
def app(environ, start_response): 
    # environ is dict-like object containing the WSGI environment 
    # refer to the PEP for details 

    # start_response is a callable that, well, starts the response 
    headers = [('Content-Type', 'text/plain; charset=utf-8')] 
    start_response('200 OK', headers) 

    return ["I'm a WSGI application.\n"] 

要运行该应用程序,需要WSGI的另一部分,它是网关。在标准库中你会发现wsgiref包。它包含一个CGI网关:

#!/usr/bin/python 
# this is a CGI script that runs a WSGI application inside CGI handler 
from wsgiref.handlers import CGIHandler 
from my_app import app 
CGIHandler().run(app) 

,也为开发一个简单的HTTP服务器:

from wsgiref.simple_server import make_server 
from my_app import app 
httpd = make_server('localhost', 8000, app) 
httpd.serve_forever() 

正如你所看到的,WSGI,可以重复使用在不同的环境中应用程序 - CGI,SCGI,FastCGI的,mod_wsgi,mod_python等,而不需要实际重写它。

WSGI的最后一部分是中间件 - 基本上,它是一个允许您组合不同WSGI应用程序的概念。它形成了一种三明治 - 请求从顶层(网关)流向底层(通常是您的应用程序),其间有一些中间层,可以实现像数据库连接池或会话之类的东西。 wsgiref包含一个这样的中间件 - wsgiref.validate.validator,它检查下面和上面的层是否符合WSGI规范的规则。

而基本上就是这样。现在去使用一个框架。

+0

+1提供比我更详细的地狱。对于“现在去使用一个框架”。 ;) – Amber 2012-03-12 09:02:23

+0

非常感谢您提供了一个非常好的答案 - 我正在寻找指南,但我认为您已经在这里给我答案!现在我打算让应用程序WSGI和**然后**去使用一个框架。很多浪费时间,但我是这样的老派:) – ShankarG 2012-03-12 09:06:15

+0

@ShankarG:大多数框架隐藏WSGI层,因为它可能在复杂的应用程序中有点麻烦。 – 2012-03-12 09:07:51

0

尝试直接转到源代码 - PEP 333,WSGI规范。