Я программист PHP, но хочу изучить Python. Я немного запутался в том, как на самом деле выполнить скрипт. Я создал test.py в корне моего веб-сервера в файле, который я написал:
#!/usr/bin/python
import jon.cgi as cgi
import jon.fcgi as fcgi
print "Content-type: text/html"
print "hello world"
На моем сервере работает Litespeed на CentOS 5, следуя руководству по адресу: http://www.litespeedtech.com/support/wiki/doku.php?id=litespeed_wiki:python_fcgi Я установил CGI Джона.
Но когда я перехожу к сценарию в моем браузере, он просто печатает полный код, как будто не разбирает его. Извините, если я задаю глупый вопрос, я буду очень признателен за любую помощь, спасибо.
Для реального ответа требуется гораздо больше информации (соответствующие пути, фрагменты конфигурации, ваш исполняемый файл * .py, перезапускали ли вы после настройки и т.д.), поэтому я сделаю все возможное, но сначала ...
В отличие от PHP, в который встроен fastCGI в сам интерпретатор, Python не скрывает от вас реализацию fastCGI. На самом базовом уровне этот test.py устанавливает недопустимые заголовки (\r\n
новые строки обязательное) и отсутствует обязательная пустая строка между заголовками и телом. Это то, что req.set_header()
и req.write()
функции (как показано в примере) имеют дело с.
Во-вторых, вы должны написать приложение fastCGI, которое будет работать «вечно» (или до тех пор, пока оно не достигнет максимального количества запросов и сервер не уничтожит его, чтобы запустить другой). В отличие от PHP, здесь нет «python-cgi», такого как «php-cgi» (во всяком случае, о котором я знаю ...), который будет работать вечно и обрабатывать запросы путем запуска небольших фрагментов исходного кода из различных файлов.
Это приложение будет иметь функцию обработчика запросов, которая вызывается для каждого запроса и отвечает за чтение и обработку фактического запроса. В случае приведенного примера Handler
класс (который является подклассом cgi.Handler
) создается и используется для создания сервера fastCGI, чей run()
Метод вызывается для обработки части вопроса "запускать вечно". В классе есть process()
участник добавил, что принимает запрос и что-то делает. Это «что-то» - вот где у вас будет код hello world.
На основе конфигурации в примере, который вы связали, когда браузер переходит на http://vhost.example.com/python/banana/apple.jpg
, litespeed попытается подключиться к существующему /absolutepathto/demoapp.py
процесс через файл сокета в /tmp/lshttpd/mypythonfcgi.sock
(или запустите программу demoapp.py и при необходимости подключитесь). После подключения он использует протокол fastCGI, чтобы сообщить запущенному приложению, что у него есть запрос на banana/apple.jpg
через REQUEST_URI
(Я считать. Это может быть /python/banana/apple.jpg или что-то в этом роде. Используйте приведенный пример для сброса запроса и посмотрите). Это зависит от process()
функция-член, чтобы выяснить, что делать с banana/apple.jpg
запрос. В отличие от обычного PHP, URL-адреса не обязательно будут соответствовать отдельным частям исходного кода. (Хотя вы можете написать программу на Python, которая использует REQUEST_URI для выполнения других программ на Python.)
Также обратите внимание, что этот /absolutepathto/fastcgiapp.py традиционно находится за пределами корня вашего серверного документа, чтобы люди не могли случайно загрузить само приложение.
Сейчас, относительно Зачем ваш скрипт распечатывается вместо того, чтобы вывести неверную ошибку заголовка, дать вам пустую страницу или просто дать сбой. Главные подозреваемые - один из трех:
/absolutepathto/test.py
"не исполняемый (хотя я уверен, что это вызовет ошибку)Если это не №1 или №4, обновите вопрос, указав соответствующую конфигурацию litespeed, и мы продолжим работу.