fdm*_*ion 2 python cgi lighttpd
我正在编写一组打算在Web上使用的Python脚本。目前,我有一些使用的测试脚本可以正常工作import cgi。
我基本上想要FastCGI / WSGI的行为。在这种情况下,我可以将特定URL下的所有请求传递给脚本。例如,假设用户访问URL http://www.example.com/script/run/1?param=true。对于/script我想要的给定脚本,例如/opt/mypython/webscript.py使用的任何请求import cgi,都可以运行并接收URL和GET参数。在这种情况下,我希望从脚本中能够看到包含一个参数/run/1和GET参数字典。
出于安全考虑,理想情况下,我们希望脚本位于文档根目录之外。
我还希望能够x-sendfile从脚本中使用标头。我知道FastCGI模块支持此功能,但不确定标准CGI是否支持。
我愿意迁移到FastCGI,但我不想重构任何代码。另外,我想在开发过程中使用标准的CGI,因为我调查的唯一FastCGI实现(波动)将导致脚本被缓存,因此在每次更改代码时都必须完全重新启动整个Web服务器。另外,flup要求您使用CGI接口进行一些不同的工作,这将意味着重写一些主要的代码。
flup确实提供了一些不错的便利;它的environ变量提供了一个PATH_INFO参数,用于指定如上所述的子路径。但是同样,标准的CGI模块并不能提供所有这些便利,因此flup需要重新编写代码,并且在开发过程中频繁更改代码的效率非常低。
因此,理想的解决方案是既使用标准CGI,又使用FastCGI来完成此任务,而无需重新编写代码。因此,在开发过程中,我可以使用标准的CGI及其伴随的性能下降(事实是python解释器必须每次启动),然后在代码准备好用于生产时轻松地将其迁移到基于FastCGI的后端,以便可以以最高性能运行。
我正在使用lighttpd的当前版本。如果可能的话,我需要做什么来配置lighttpd?
在您的lighttpd配置中,创建一个别名,该别名映射http://host/script到CGI脚本的路径:
alias.url += ( "/script" => "/opt/mypython/webscript.py" )
Run Code Online (Sandbox Code Playgroud)
为该脚本启用CGI处理:
$HTTP["url"] =~ "^/script" {
cgi.assign = ( "" => "" )
}
Run Code Online (Sandbox Code Playgroud)
创建一个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
Run Code Online (Sandbox Code Playgroud)
最后,通过Web浏览器调用脚本:
http://localhost/script/run/1?param=true
Run Code Online (Sandbox Code Playgroud)
结果:
/run/1
true
Run Code Online (Sandbox Code Playgroud)