Вопрос

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

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, который вызывает конструктор родительского объекта cgi.FieldStorage.Вот тут-то оно и зависает.

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top