Как вызвать ошибку http / исключение из сценария Python CGI? - PullRequest
4 голосов
/ 29 октября 2009

Как вызвать ошибку http / исключение из сценария Python CGI?

Все, что нужно, это напечатать соответствующий заголовок:

print '''Status: 501 Not Implemented
Content-type: text/html

'''

Это, кажется, не работает правильно.

У меня есть очень простая настройка, а именно: маршрутизация IIS7 * .py CGI-скрипты к python25.exe для выполнения. Я не использую WSGI или FastCGI. Использование «обычных» модулей CGI: cgitb и cgi

Ответы [ 3 ]

3 голосов
/ 29 октября 2009

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

Вот еще кто-то, кто задавал тот же вопрос, более или менее.

Возвращение http-кодов состояния в Python CGI

Следуете ли вы спецификации HTTP при печати кода состояния? Можете ли вы попробовать распечатать только код состояния, а не его описание?

Может, как ...

print '''Status:501
Content-type: text/html

'''

Или это должно быть похоже ...

print '''HTTP/1.1 501 Not Implemented
Content-type: text/html

'''

Не могли бы вы проверить с вашей настройкой, чтобы проверить?

Возвращение статуса из CGI:

http://oreilly.com/openbook/cgi/ch03_07.html

Я полагаю, что «Статус: 501 не реализован», как у вас изначально, и есть путь. Я не знаю, почему это не работает. Печатаете ли вы содержимое без заголовка перед печатью кода состояния?

Еще один источник, подтверждающий, что вы все делаете правильно (см. Раздел 6.3.3.):

http://www.ietf.org/rfc/rfc3875

РЕДАКТИРОВАТЬ 1,2,3: расширенный ответ

2 голосов
/ 29 мая 2012

Запустите ваш скрипт с: cgitb.enable() Затем для вывода правильного кода ошибки во время исключения используйте:

try:
  blah blah failed code
except:
  print "Status: 500"
  cgitb.handler()
0 голосов
/ 30 октября 2009

Python CGI, возвращающий код состояния http, например 403?

Там предложен один ответ:

sys.stdout ('Статус: 403 Запретный \ г \ п \ г \ п ')

может быть технически более правильным, в соответствии с RFC (при условии, что ваш CGI-скрипт не работает в текстовом режиме на винде). Однако оба конца строки кажется, работает везде.

Но так как вы делаете это на окнах и не заканчиваете заголовок строкой состояния ...

sys.stdout('Status: 501 Not Implemented\n')

Я не понимаю, почему использование sys.stdout имело бы значение, поскольку для печати следует использовать stdout.

...