Cherrypy висит на форме сообщения - PullRequest
0 голосов
/ 06 января 2010

В настоящее время я пытаюсь удалить устаревшую среду Python (webware 0.8.1) и слой cherrypy 3.1.2 поверх него. Вместо того, чтобы преобразовывать все страницы веб-приложений в страницы с вишневым расширением, я просто обрабатываю их с помощью веб-приложений и передаю их таким образом.

def default(self, url, *suburl, **kwarg):    
  ...snip...
  strmout = DispatcherIO()
  request = HTTPRequest(local_req)
  transaction = self.create_transaction(request)
  response = self.create_response(transaction, strmout)
  transaction.setServlet(servlet)
  transaction.awake()
  transaction.respond()
  return str(strmout)

Это прекрасно работает для любой страницы, не содержащей POST. Но с любой страницей, включая сообщение, такое как логин, cherrypy будет висеть по адресу:

request = HTTPRequest(local_req)

Это вызывает FieldStorage, который вызывает конструктор для parant cgi.FieldStorage. Вот где он наконец и висит.

Однако, если бы я нажал ctrl-c на терминале, он продолжил бы обработку и затем завершился бы после успешной загрузки страницы. Итак, на странице входа в систему я бы нажал «войти», он зависнет, затем я нажму ctrl-c на терминале, он войдет в систему и затем отключит cherrypy.

Я обнаружил, что если бы я использовал cherrypy.engine.start вместо quickstart, он бы не инициировал никаких обработчиков сигналов. То, что произойдет в этом случае, приведет к чему-то похожему на предыдущее, однако cherrypy продолжит работать.

Что может быть причиной этой проблемы? Я был бы очень признателен за любую помощь. Приветствия.

1 Ответ

2 голосов
/ 06 января 2010

У меня на самом деле нет опыта работы с Webware, но, основываясь на внешнем виде вашего кода, Webware пытается использовать cgi.FieldStorage для получения переменных поля, но FieldStorage не может получить длину или неверно получает длину (вероятно, потому что все, что Webware делает для получения заголовка Content-Length, не работает в вашей среде CherryPy WSGI - реализация по умолчанию извлекает переменную среды HTTP_CONTENT_LENGTH, и Webware, вероятно, делает что-то похожее хакерское), поэтому она читает, а затем зависает , У меня часто возникала подобная проблема при работе с CGI.

Лучшее решение - не использовать cgi.FieldStorage. Если рассматриваемый объект HTTPRequest исходит от Webware, я рекомендую либо полностью перенести ваш сайт на CherryPy (или какую-либо другую веб-платформу), либо просто использовать Webware в его собственной среде. Взломать что-то можно, но WSGI сильно отличается от собственной среды Webware собственного сервера приложений.

...