Почему я получаю ошибку 500 при запуске CGI из `public_html`, когда он работает с CGI-сервером python? - PullRequest
1 голос
/ 18 марта 2012

Сводка: Сценарий Python cgi запускается, как и ожидалось, при вызове с простого сервера отладки python, но завершается с ошибкой 500 Premature end of script headers при запуске из ~/public_html/cgi-bin/

Проблемы

Мой CGI-скрипт отлично работает при запуске через простой веб-сервер python, и я вижу правильный вывод при переходе к nameofmyhost.com:8080/...

Однако при запуске того же скрипта из моего каталога public_html/cgi-bin выдается ошибка 500 premature end of script headers. Что я могу сделать, чтобы это исправить?

Права доступа к файлу выглядят нормально:

drwxrwxrwx   cgi-bin
-rwxr-xr-x   cgi-bin/generate_list.py

Это simple_httpd.py, простой веб-сервер python

from http.server import HTTPServer, CGIHTTPRequestHandler

port = 8080

httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
print("Starting simple_httpd on port: " + str(httpd.server_port))
httpd.serve_forever()

CGI-скрипт generate_list.py:

#! /usr/local/bin/python3
import athletemodel
import yate
import glob

data_files = glob.glob("data/*.txt")
athletes = athletemodel.put_to_store(data_files)

print(yate.start_response())
print(yate.include_header("Coach Kelly's List of Athletes"))
print(yate.start_form("generate_timing_data.py"))
print(yate.para("Select an athlete from the list to work with:"))

for each_athlete in athletes:
    print(yate.radio_button("which_athlete", athletes[each_athlete].name))
print (yate.end_form("Select"))

print(yate.include_footer({"Home": "/index.html"}))

Полагаю, мне нужно где-то явно указать мой каталог, может быть?

PS: я изучаю книгу "Head First Python" Орейли

Шаги отладки

  1. Убедитесь, что сервер может найти мои файлы

    Сервер находит простой html-файл в public_home [OK]

  2. Убедитесь, что скрипт CGI может выполняться без ошибок.

        Content-type: text/html 
    
        <html> 
        <head> 
        <title>Coach Kelly's List of Athletes</title>
        [...]
    

    CGI-скрипт запускается из командной строки - выводит как положено [OK]

  3. Убедитесь, что сервер может выполнить простой скрипт CGI в том же месте

    Попробуйте простой CGI-скрипт, чтобы увидеть, способен ли сервер выполнить какие-либо CGI-скрипты на всех :

        #!/usr/local/bin/python3
        print("Content-Type; text/html")
        print("")
        print("<html><body><h1>hello</h1></body></html>")
    

    Сервер не может выполнить простой CGI-скрипт, выдавая ту же ошибку [FAIL]

Исправления

Fix 1: Измените путь данных на абсолютный вместо относительного:

- data_files = glob.glob("data/*.txt")
+ data_files = glob.glob("/home/delliott/public_html/webapp/data/*.txt")

1 Ответ

0 голосов
/ 20 марта 2012

Проблема в том, что база вашего школьного веб-сервера не совпадает с базой сервера simple_httpd.py. Это означает, что вам придется указывать абсолютные пути к вашему каталогу данных вместо относительных путей.

Измените следующие строки:

- data_files = glob.glob("data/*.txt")
+ data_files = glob.glob("/home/<username>/public_html/data/*.txt")

Теперь это должно вести себя как ожидалось (если я правильно понимаю вашу проблему.)

[Редактировать]: Быстрый способ проверить, работают ли ваши скрипты cgi-bin, - запустить их из командной строки. Войдите на свой школьный сервер и попробуйте собственный скрипт cgi:

$ cd /home/<username>/public_html/
$ python3 my_cgi_script.py

Это должно распечатать html, который вы ожидаете, или трассировку стека.

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