2008-12-18 4 views
9

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

500 Internal Server Error 

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

Premature end of script headers 

Единственная документация этой ошибки в Интернете говорит, что это может быть результатом того, неправильная линия возврата символов в вашем скрипте, но я написал свой тестовый скрипт прямо из оболочки с помощью pico. Кроме того, когда я запускаю файл из командной строки, он выполняется просто отлично. " До сих пор единственное изменение, которое я сделал для апача, чтобы добавить .py к„CGI-скрипты линии AddHandler“.

Спасибо!


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

#!/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 I установить apache для распознавания .py как меня выше. Я запускаю скрипт из основной папки public_html.


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

Я запускаю Apache/1.3.41 на linux (красная шляпа 3.4) с установленной WHM/Cpanel.

ответ

5

Две вещи возникают сразу же на ум.

  1. Убедитесь, что вы выводя Content-Type: text/html заголовок
  2. Убедитесь, что вы добавляете два перевода строки («\ п») после того, как заголовки, прежде чем вы выхода «Привет, мир» или любой другой.
7

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

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

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

+0

Два \ n (HTTP требует пустой строки после заголовков) – bortzmeyer

1

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

import cgitb; cgitb.enable()

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

+0

Я добавил эту строку в начало сценария и заглавную «Тип», но все же получаю ту же ошибку и никакой дополнительной информации. – user47514

+0

Как выглядит ваша линия shebang? И какая у вас платформа? – Triptych

+0

Действительно, капитализация не имеет значения для имен заголовков. Стандарт HTTP RFC 2616 говорит в разделе 4.2, что заголовки HTTP имеют тот же общий синтаксис, что и заголовки RFC 822. И RFC 822, раздел 3.4.7, говорит, что имена заголовков не чувствительны к регистру. – bortzmeyer

11

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

Try:

chmod a+x foo.py 

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

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

+0

Хех, это, вероятно, правильно. Наверное, я не думал об этом. – Triptych

4

OK последняя догадка:

Пытаясь изменить это притон линию:

#!/usr/bin/env python 

или

#!/usr/bin/local/env python 

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

+1

Спасибо! @ Триптих, это помогло мне. :) –

0

Я был похож проблемы запуска свой собственный локальный сервер, но получил он решается после этого руководство шаг за шагом: HOWTO Use Python in the web

0

Звуки для меня, как вы используете сценарий, написанный в ОС Windows на компьютере Unix , без предварительного преобразования концов строк из 0d0a в 0a. Его легко преобразовать. Один из способов - с вашей программой ftp; передайте файл в режиме ASCII. Способ использования Metapad заключается в использовании File-> FileFormat перед сохранением.

0

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

(Вы правы, не заморачиваться с mod_python)

Примечания, я использую Apache2, но mod_wsgi работает на 1.3, а также, на основе modwsgi page.

Если вы на Redhat, я полагаю, у вас есть конфетка, поэтому убедитесь, чтобы получить модуль Apache WSGI и другие пакеты Python:

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

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

$ easy_install-2.6 web.py 

Создайте каталог для питона сценариев: /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/ 

В файле питона, 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 со словом «мир» до возвращения результата.

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

0

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

0

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

#!/usr/local/bin/python2.6 
print('Content-type: text/html\r\n') 
print('\r\n') 
print('Hello, World!') 
1

Общей ошибкой является неправильный путь. В моем случае это был usr/bin/python. Другая распространенная ошибка не переносит файл в режиме ASCII. Я использую WinSCP, где вы можете легко установить его: перейдите в Options-> Preferences-> Transfers-> щелкните Edit и измените режим на Text.

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

#!/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>"; 
2

Если вы настроили апачей HTTPd файл правильно, то вы могли бы получить эту ошибку для следующих два reasons.Make уверен, что это правильно.

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

Большое спасибо. Я не могу поверить, что «1. Include« #!/Usr/bin/python »....» может быть причиной. –

Смежные вопросы