我有一个几乎完整的简单的网络应用程序被编写为Python CGI脚本。我想将其改为使用WSGI,但我无法找到帮助我理解WSGI实际是什么的文档(只能通过start_response等方式重复查找调用,但似乎没有太多的解释呼叫实际上是)。有人能指点我一个很好的解释,再加上关于如何使用WSGI?需要一个好的初学者的WSGI指南
编辑:补充一点,我见过this question但答案似乎仍然不能告诉一个如何在直接脚本中使用WSGI(如在一个框架反对)。
我有一个几乎完整的简单的网络应用程序被编写为Python CGI脚本。我想将其改为使用WSGI,但我无法找到帮助我理解WSGI实际是什么的文档(只能通过start_response等方式重复查找调用,但似乎没有太多的解释呼叫实际上是)。有人能指点我一个很好的解释,再加上关于如何使用WSGI?需要一个好的初学者的WSGI指南
编辑:补充一点,我见过this question但答案似乎仍然不能告诉一个如何在直接脚本中使用WSGI(如在一个框架反对)。
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规范的规则。
而基本上就是这样。现在去使用一个框架。
尝试直接转到源代码 - PEP 333,WSGI规范。
哎呀,我刚刚发现[本指南来自Armin Ronacher](http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/),这似乎是我一直在寻找。也推荐给其他人。我认为,不能克服这个问题,所以要求其他人这样做。 – ShankarG 2012-03-12 08:58:47