我正在为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?
答案 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