目标是能够执行存储在WWW目录中的任意脚本文件,例如http://www.example.com/*.py 。
我不想为每个请求产生一个新的Python实例(解释器)(就像我在常规CGI中做的那样,如果我没有弄错的话),这就是我使用FastCGI的原因。
遵循Lighttpd的文档 ,以下是我的configuration文件的FastCGI部分。 问题是它总是为每个* .py文件运行/usr/local/bin/python-fcgi脚本,而不pipe该文件的内容如何:
http://www.example.com/script.py [output=>] "python-fcgi: test"
(不pipescript.py的内容如何)
我对使用任何框架不感兴趣,只是执行单个[web]脚本。
我怎样才能使它像PHP一样,通过请求它的path在WWW目录中执行任何脚本?
/etc/lighttpd/conf.d/fastcgi.conf:
server.modules += ( "mod_fastcgi" ) index-file.names += ( "index.php" ) fastcgi.server = ( ".php" => ( "localhost" => ( "bin-path" => "/usr/bin/php-cgi", "socket" => "/var/run/lighttpd/php-fastcgi.sock", "max-procs" => 4, # default value "bin-environment" => ( "PHP_FCGI_CHILDREN" => "1", # default value ), "broken-scriptfilename" => "enable" ) ), ".py" => ( "python-fcgi" => ( "socket" => "/var/run/lighttpd/fastcgi.python.socket", "bin-path" => "/usr/local/bin/python-fcgi", "check-local" => "disable", "max-procs" => 1, ) ) )
/usr/local/bin/python-fcgi:
#!/usr/bin/python2 def myapp(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return ['python-fcgi: test\n'] if __name__ == '__main__': from flup.server.fcgi import WSGIServer WSGIServer(myapp).run()
PHP(FastCGI)解释器被构build为以这种方式运行PHP文件; 即它运行一个脚本,然后忘记它的所有内部状态,并重新开始。
Python不是为此而构build的。
你可以试着在flup上build立一个解决scheme; 你会__import__请求的脚本,并调用它或类似的“handleRequest”函数。
你可以“重新加载”一个模块来更新它: https : //stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module
但是你不能卸载模块,所以内存使用会增加: https : //stackoverflow.com/questions/3105801/unload-a-module-in-python