Python + LigHTTPd + CGI:如何配置为整个子路径执行单个脚本

时间:2014-08-26 17:09:54

标签: python cgi lighttpd

我正在为Python编写一组脚本,我打算在Web上使用它。目前,我有一些使用import cgi正常工作的测试脚本。

我基本上想要FastCGI / WSGI的行为。在这种情况下,我可以将特定URL下的所有请求传递给脚本。例如,假设用户访问URL http://www.example.com/script/run/1?param=true。对于/script下的任何请求,我想要一个给定的脚本,比如使用/opt/mypython/webscript.py的{​​{1}}来运行和接收URL和GET参数。在这种情况下,我希望在脚本中能够看到包含import cgi的参数和GET参数字典。

出于安全考虑,理想情况下我们希望将脚本置于文档根目录之外。

我也希望能够在我的脚本中使用/run/1标头。我知道FastCGI模块支持这一点,但不确定标准CGI是否支持。

我愿意转到FastCGI,但我不想重构我的任何代码。此外,我想在开发期间使用标准CGI,因为我查看的唯一FastCGI实现(flup)会导致脚本被缓存,因此在任何代码更改时都需要完全重新启动整个Web服务器。另外,flup要求你使用CGI接口稍微改变一下,这意味着一些重要的代码会被重写。

flup确实提供了一些不错的便利;它的x-sendfile变量提供了一个environ参数,用于指定上面提到的子路径。但同样,标准的CGI模块并不能提供所有这些便利,因此需要进行代码重写,并且在代码发生频繁变化时,它在开发过程中非常无效。

所以理想的解决方案是使用标准CGI和FastCGI来实现这一点,而无需重新编码代码。因此在开发过程中,我可以使用标准的CGI,其伴随的性能受到影响(python解释器每次都必须启动),然后当代码准备好用于生产时,可以轻松地将其迁移到基于FastCGI的后端,以便它可以以最高性能运行。

我正在使用lighttpd的当前版本。如果可能的话,我需要做些什么才能配置lighttpd?

1 个答案:

答案 0 :(得分:4)

在lighttpd配置中,创建一个将http://host/script映射到CGI脚本路径的别名:

alias.url += ( "/script" => "/opt/mypython/webscript.py" )

启用该脚本的CGI处理:

$HTTP["url"] =~ "^/script" {
    cgi.assign = ( "" => "" )
}

创建一个CGI脚本,用于检查查询字符串和PATH_INFO环境变量:

import cgi, os, sys

print 'Content-Type: text/plain\n'

if 'PATH_INFO' in os.environ:
    print os.environ['PATH_INFO']
form = cgi.FieldStorage()
if 'param' in form:
    print form['param'].value

最后,通过网络浏览器调用脚本:

http://localhost/script/run/1?param=true

结果:

/run/1
true