Задний план:
Я попытался (сильный акцент на «попытке») настроить приложение через IIS (6.1, Windows Server 2008 R1), которое направляет все запросы через скрипт Python. Конечная цель состояла в том, чтобы создать очень легкий API на сервере.
По сути, я сделал следующие шаги:
*
и бежит c:\Python27\python.exe -u "c:\inetpub\wwwroot\testapi\cgiadapter.py"
testapi
c:\inetpub\wwwroot\testapi
Сделать основной test, был протестирован и работает следующий скрипт:
import cgi, cgitb
# Detailed error logging to screen
cgitb.enable()
# Output basic response
print 'content-type:text/plain'
print
print 'Hello World'
Затем я пытаюсь обновить скрипт для чтения в запросе от стандартный ввод
import cgi, cgitb
# Detailed error logging to screen
cgitb.enable()
# Attempt to read the raw request from CGI
import sys
request = sys.stdin.read()
# Output basic response
print 'content-type:text/plain'
print
print 'Hello World'
Внезапно я получаю следующую ошибку: <type 'exceptions.IOError'>: [Errno 9] Bad file descriptor
в строке, содержащей stdin.read()
.
Вопрос:
Почему stdin
считается плохим файлом?
Я что-то неправильно настроил в IIS или это ограничение для IIS? Или, возможно, тот факт, что запрос доставляется через стандартный ввод, является неверным предположением?
Спасибо!
У меня была такая же проблема, и я обнаружил, что в IIS вам нужно использовать переменную среды CONTENT_LENGTH, чтобы ограничить объем данных, которые вы читаете из stdin. Вот что я добавил в свой код, чтобы он работал в IIS7:
try:
import os
request = sys.stdin.read(int(os.environ['CONTENT_LENGTH']))
except:
request = ''
Немного поздно ... но я думаю, что stdin
(fd 0) был закрыт.