f = open() / работает в командной строке, но не как CGI-скрипт [python]

#python #cgi

#python #cgi

Вопрос:

     #! /usr/bin/env python

import htmlSplitter, htmlGlue

headerContent, mainContent, sideSetup, sideContent, footerContent = htmlSplitter.split("../htdocs/bcc/register.html")


mainContent = "<h1>This is another Test</h1>"
sideContent = "<h2>Jonathan's here!</h2>"


htmlDoc = htmlGlue.glue(headerContent, mainContent, sideSetup, sideContent, footerContent)

f = open("../bcc/doctest.html", "w")
f.write(htmlDoc)
f.close()

print("Location:../bcc/doctest.html")
print
  

этот скрипт отлично работает, когда я запускаю его из командной строки. Однако, когда я запускаю его как CGI-скрипт, он выдает ошибку «преждевременное завершение заголовков скрипта». Я отладил, и ничего страшного, если я закомментирую сегмент, который открывается и записывает «doctest.html » (поэтому я знаю, что два других модуля, которые я включил, не вызывают проблемы). Есть идеи, почему эта часть кода не работает как CGI-скрипт? Есть ли что-то, что я должен заменить вместо этого?

ПРИМЕЧАНИЕ: Я выполнил chmod a rw на ‘doctest.html ‘ чтобы убедиться, что у скрипта есть разрешения на редактирование.

Спасибо!

Комментарии:

1. Вы можете использовать cgitb , чтобы узнать, что происходит. import cgitb; if DEBUG: cgitb.enable()

2. понял. я уверен, что это полезный инструмент, о котором мне, вероятно, следовало знать. Спасибо!

3. У меня была неправильная реляционная ссылка. Работа с несколькими сайтами с одного сервера apache и cgi-bin иногда приводит меня в замешательство, поскольку я знаю, что отношения будут другими, как только я загружу их на сервер моей компании.

4. Пожалуйста, опубликуйте решение в качестве ответа, чтобы остальные из нас могли учиться.

Ответ №1:

Добавьте следующее в начало вашего скрипта:

 #!/usr/bin/env python
print 'Content-Type: text/html'
print
  

Я всегда объявлял Content-Type в своих cgi-скриптах на python, это вежливо.

 import cgi
import cgitb
cgitb.enable() # allows error tracebacks
  

cgitb покажет вам хорошую обратную трассировку на веб-основе, если что-то пошло не так с вашим скриптом, например, возникли какие-либо исключения.

Комментарии:

1. cgitb помог; у меня возникла ошибка реляционной ссылки. Как ни странно, имя файла open() не совпадает с путем перенаправления (Location:) имени файла, что я нахожу странным. Я ценю помощь!

Ответ №2:

Может быть, просто ошибка копирования / вставки, но ваш shebang, похоже, имеет отступ. отмените его и попробуйте запустить скрипт через командную строку на сервере, используя ./yourscript (не python yourscript , поскольку именно так он, вероятно, выполняется веб-сервером)