Настройте Apache для использования Python так же, как CGI PHP

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

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

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

  • mod_wsgi и несколько установок python
  • Запустите проект Django внутри wordpress (на suburl wordpress с помощью Apache и mod_wsgi)
  • Как настроить скрипты Python для работы в Apache 2.0?
  • Получение «str» не имеет свойства «_default_manager» в приложении Django только при запуске
  • Как ограничить размер загружаемого файла apache + django
  • Запуск django и фляжки на том же сервере Apache
  •  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 работать таким образом. Так что, возможно, это невозможно, но тогда мне любопытно, почему это так? Или я чего-то не хватает?

  • Открытый модуль Python os открывает выше существующий каталог с относительным путем
  • Как разместить скрипт cgi python с помощью `python -m SimpleHTTPServer 8000` или` python -m CGIHTTPServer 8000`?
  • Где я должен начать создавать скребок или бот с помощью python?
  • «Ошибка Windows: не удалось правильно инициализировать DLL-провайдера» при импорте модуля cgi в замороженном приложении wxpython
  • ModSecurity: выходной фильтр: не удалось прочитать ведро (rc 104): сброс соединения с помощью одноранговой сети
  • Конфигурация django apache с WSGIDaemonProcess не работает
  • 4 Solutions collect form web for “Настройте Apache для использования Python так же, как CGI PHP”

    «Так что, возможно, это невозможно, но тогда мне любопытно, почему это так?»

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

    Причина 1 – Python – это не PHP. PHP – в целом – рассчитывает стать CGI. Python этого не делает.

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

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

    Вы можете использовать любой тип исполняемого файла как 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

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

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

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

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

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

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

     #!/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 поскольку он указывает непосредственно на файл в веб-корне.
    Вызов execfile интерпретирует этот скрипт внутри уже открытого процесса python.

    Python - лучший язык программирования в мире.