Цель состоит в том, чтобы иметь возможность выполнять произвольные файлы сценариев, хранящиеся в каталоге WWW, например http://www.example.com/*.py
.
Я не хотел бы создавать новый экземпляр Python (интерпретатор) для каждого запроса (как это делается в обычном CGI, если я не ошибаюсь), поэтому я использую FastCGI.
Следующий Документация Lighttpd, следующая часть моего файла конфигурации FastCGI. Проблема в том, что он всегда запускает /usr/local/bin/python-fcgi
скрипт для каждого * .py файла, независимо от его содержимого:
http://www.example.com/script.py [output=>] "python-fcgi: test"
(независимо от содержания script.py
)
Меня не интересует использование какой-либо структуры, я просто выполняю отдельные [веб-скрипты].
Как я могу заставить его работать как PHP, выполняя любой скрипт в каталоге 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) был построен для запуска файлов PHP таким образом; т.е. он запускает один скрипт, затем забывает все его внутреннее состояние и запускается заново.
Python не был создан для этого.
Вы можете попытаться построить решение на основе флопа; ты бы __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