Начало работы Python, внутренняя ошибка сервера - PullRequest
9 голосов
/ 18 декабря 2008

Я пытаюсь заставить работать скрипты Python, вызываемые из веб-браузера. Я получаю сообщение об ошибке:

500 Internal Server Error

Когда я проверяю свои журналы ошибок, я вижу сообщение

Premature end of script headers

Единственная документация по этой ошибке в Интернете говорит о том, что она может быть результатом неправильных символов возврата строки в вашем скрипте, но я написал свой тестовый скрипт прямо из оболочки с pico. Кроме того, когда я запускаю файл из командной строки, он работает просто отлично. " Пока единственное изменение, которое я сделал в apache, это добавление .py в строку «AddHandler cgi-script».

Спасибо!


Спасибо за быстрый ответ. Вот последняя версия тестового кода. Я добавил пару новых строк перед выводом, как предложено, но все еще получаю ту же ошибку:

#!/usr/local/bin/python
print "Content-type: text/html\n"
print "\n\n"
print "<HTML>"
print "<HEAD>"
print "<TITLE>Test</TITLE>"
print "</HEAD>"
print "<BODY>"
print "<H2>Hi there.</h2>"
print "</BODY>"
print "</HTML>"

Некоторые другие детали: я использую Apache 1.3 и у меня нет mod_python. Я установил Apache для распознавания .py, как указано выше. Я запускаю скрипт из основной папки public_html.


Обновление. Кажется, не имеет значения, что я положил в линию Шебанга. Я перепробовал все предложения, и даже если я оставлю это поле пустым, в журнале ошибок появляется та же ошибка, и я получаю ошибку 500.

Я использую Apache / 1.3.41 на Linux (Red Hat 3.4) с установленным WHM / Cpanel.

Ответы [ 11 ]

12 голосов
/ 18 декабря 2008

Это именно то поведение, которое вы получите, если ваш скрипт Python не имеет установленного разрешения на выполнение.

Попытка:

chmod a+x foo.py

(где foo.py - имя вашего скрипта).

Для получения дополнительной информации см. учебник Apache .

7 голосов
/ 18 декабря 2008

есть ли у вас что-то подобное наверху, прежде чем печатать что-нибудь еще?

print "Content-type: text/html\n"

Если у вас это уже есть, отправьте свой код.

5 голосов
/ 18 декабря 2008

Две вещи сразу приходят на ум.

  1. Убедитесь, что вы выводите заголовок Content-Type: text/html
  2. Убедитесь, что вы добавляете две новых строки ("\ n") после заголовков, прежде чем выводить "Hello, world" или что-то еще.
4 голосов
/ 18 декабря 2008

ОК, последнее предположение:

Попытка изменить эту строку Шебанга на:

#!/usr/bin/env python

или

#!/usr/bin/local/env python

Также было бы полезно узнать вашу платформу / хостинг-провайдера.

2 голосов
/ 23 января 2016

Если вы правильно настроили файл Apache httpd, то вы можете получить эту ошибку по двум причинам. Убедитесь, что они верны.

  1. Включите '#! / Usr / bin / python' или '#! C: / Python27 / python' или, соответственно, в ваш скрипт в качестве первой строки.
  2. Убедитесь, что после печати "Content-type: text / html" есть место, т. Е.
    выведите «Content-type: text / html \ n \ n»;
    Надеюсь, это поможет !!
2 голосов
/ 28 февраля 2014

Одна распространенная ошибка - неправильный путь. В моем случае это был usr / bin / python. Другая распространенная ошибка - не передача файла в режиме ASCII. Я использую WinSCP, где вы можете легко установить его: Перейдите в «Настройки» -> «Настройки» -> «Переводы» -> нажмите «Изменить» и измените режим на «Текст».

Этот код должен работать:

#!/usr/bin/python
print "Content-type: text/html\n\n";
print "<html><head>";
print "<title>CGI Test</title>";
print "</head><body>";
print "<p>Test page using Python</p>";
print "</body></html>";
1 голос
/ 18 декабря 2008

Вы также можете получить лучшее сообщение об ошибке, добавив эту строку вверху скрипта Python:

import cgitb; cgitb.enable()

Кроме того, заголовок должен начинаться с заглавной буквы Content-Type, а не Content-type, хотя я сомневаюсь, что это что-то нарушает.

0 голосов
/ 28 июля 2013

У меня была похожая проблема, проблема в том, что вам нужно иметь два разрыва строк после печати типа контента. У меня сработало следующее:

#!/usr/local/bin/python2.6
print('Content-type: text/html\r\n')
print('\r\n')
print('Hello, World!')
0 голосов
/ 31 декабря 2012

Вы можете также получить некоторую ту же глупость, если у вас есть конец строки в стиле DOS на веб-сервере linux. (Это просто пережевало около двух часов моего утра сегодня.) Выключить, чтобы обновить мой vim.rc на этом окне Windows, которое мне нужно использовать.

0 голосов
/ 17 февраля 2012

Я попробовал много подходов, чтобы Python работал с Apache должным образом, и, наконец, решил использовать Apache + mod_WSGI + web.py . Это звучит как много, но это намного проще, чем использовать сложные фреймворки, такие как Django.

(Вы правы, не беспокойтесь о mod_python)

Обратите внимание, я использую Apache2, но mod_wsgi работает и на 1.3, основываясь на странице modwsgi .

Если вы работаете в Redhat, я думаю, что у вас есть yum, поэтому убедитесь, что вы получили модуль apache wsgi и другие пакеты python:

$ yum update
$ yum install gcc gcc-c++ python-setuptools python-devel
$ yum install httpd mod_wsgi

И получите web.py для вашей версии python. Например, используя easy_install. У меня v2.6.

$ easy_install-2.6 web.py

Создайте каталог для ваших скриптов на python: /opt/local/apache2/wsgi-scripts/

В вашем httpd.conf:

LoadModule wsgi_module modules/mod_wsgi.so 

# note foo.py is the python file to get executed 
# and /opt/local/apache2/wsgi-scripts/ is the dedicated directory for wsgi scripts
WSGIScriptAlias /myapp /opt/local/apache2/wsgi-scripts/foo.py/

AddType text/html .py

<Directory /opt/local/apache2/wsgi-scripts/>

    Order allow,deny
    Allow from all
</Directory>

Обратите внимание, что web.py использует "каталог шаблонов". Поместите это в каталог wsgi, /opt/local/apache2/wsgi-scripts/templates/.

Создать файл /opt/local/apache2/wsgi-scripts/templates/mytemplate.html:

$def with (text)
<html>
<body>
Hello $text.
</body>
</html>

Добавьте соответствующие разрешения.

$ chown -R root:httpd   /opt/local/apache2/wsgi-scripts/
$ chmod -R 770   /opt/local/apache2/wsgi-scripts/

В вашем файле Python, foo.py:

import web

urls = ( '/', 'broker',)
render = web.template.render('/opt/local/apache2/wsgi-scripts/templates/')

application = web.application(urls, globals()).wsgifunc()

class broker:
    def GET(self):
        return render.mytemplate("World")

Приведенное выше заменит специальную текстовую переменную web.py $ в mytemplate словом "World" перед возвратом результата.

http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.html

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