Настройте Apache для использования Python так же, как CGI PHP - PullRequest
0 голосов
/ 28 апреля 2009

Я думаю, что один из общеизвестных способов добавления PHP в веб-сервер Apache - настроить его следующим образом:

ScriptAlias /php5.3 /usr/local/php5.3/bin
Action application/php5.3 /php5.3/php-cgi
AddType application/php5.3 .php

Теперь я попытался написать аналогичную конфигурацию для Python:

ScriptAlias /python /usr/bin
Action application/python /python/python
AddType application/python .py

У меня есть небольшой тестовый скрипт, который выглядит так:

print "Content-Type: text/html\n\n"
print "Test"

Но, похоже, что-то не так, поскольку журнал ошибок apache сообщает следующее:

Premature end of script headers: python

Итак, во-первых, мой ответ на Python был неправильным. Но есть Content-Type, а также оба перевода строки. Кроме того, вывод аналогичного сценария PHP, вызываемого с помощью php-cgi, дает точно такой же вывод.

Также я не нашел учебник, который показывает, как заставить Python работать таким образом. Так что, возможно, это не возможно, но тогда мне интересно, почему это так? Или я что-то упустил?

Ответы [ 4 ]

13 голосов
/ 29 апреля 2009

Вы можете использовать любой тип исполняемого файла как cgi. Ваша проблема в конфигурации Apache, которая выглядит так, как будто вы только что ее создали. Обратитесь к документации по Apache для получения более подробной информации, но вам не нужны Action и AddType.

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

Затем поместите в свой cgi-bin следующее:

#!/usr/bin/python
# test.py
print "Content-Type: text/html\n\n"
print "Test"

Убедитесь, что он исполняемый, и посмотрите результат в /cgi-bin/test.py

.
5 голосов
/ 28 апреля 2009

«Так что, возможно, это невозможно, но тогда мне интересно, почему это так?»

Правильно. Это невозможно. Это никогда не было предназначено.

Причина 1 - Python не является PHP. PHP - в целом - ожидает быть CGI. Python нет.

Причина 2 - Python по своей сути не является CGI. Это переводчик, который (почти) не имеет экологических ожиданий.

Причина 3 - Python никогда не разрабатывался как CGI. Вот почему Python обычно встроен в небольшие оболочки (mod_python, mod_wsgi, mod_fastcgi), которые могут инкапсулировать среду CGI в форме, которая более понятна для работающей программы Python.

1 голос
/ 31 июля 2012

Ошибка «Преждевременное завершение заголовков сценария:» может возникнуть, если файл .py был отредактирован в программе Windows, которая использует символы CRLF для разрыва строки вместо Unix LF.

Некоторые программы, такие как Dreamweaver, имеют в настройках тип перевода строки. Блокнот также использует CRLF.

Если на вашем хосте есть файловый редактор, вы можете протестировать, отодвинув текущие разрывы строк и повторно введя их через этот редактор, который изменит любой CRLF только на LF. Notepad ++ может использовать только LF.

0 голосов
/ 16 июля 2014

Когда вы открываете, например, http://localhost/test.py, вы ожидаете, что Apache каким-то образом запустит процесс /usr/bin/python /var/www/test.py (т. Е. Интерпретатор с одним аргументом командной строки). Но это не то, что происходит, потому что Apache вызывает скрипт cgi с no аргументами. Вместо этого он предоставляет всю информацию через переменные среды, которые стандартизированы CGI.

Как уже отмечали другие, использование python в качестве простого cgi неэффективно, но если по образовательным причинам вы все равно хотели бы сделать это, вы можете попробовать это.

Предполагая, что настройки Apache cgi-bin по умолчанию активны, вы можете создать простую оболочку с именем python (или что вы выберете) в /usr/lib/cgi-bin со следующим содержимым:

#!/usr/bin/python
import os
execfile(os.environ['PATH_TRANSLATED'])

Не забудьте сделать его исполняемым: chmod a+x /usr/lib/cgi-bin/python

Поместите это в ваш конфиг Apache:

AddType application/python .py
Action application/python /cgi-bin/python

Теперь, когда вы откроете http://localhost/test.py Apache выполнит / cgi-bin / python без аргументов, но с заполненными переменными среды CGI. В этом случае мы используем PATH_TRANSLATED, так как он указывает непосредственно на файл в webroot.
Вызов execfile интерпретирует этот скрипт внутри уже открытого процесса python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...