0

我目前正在尝试删除一个遗留的 python 框架(webware 0.8.1)并在其上分层cherrypy 3.1.2。我没有将所有 webware 页面转换为cherrypy 页面,而是通过 webware 对其进行处理并将其传递给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 而不是 quickstart 它不会启动任何信号处理程序。在这种情况下会发生什么会导致与之前的行为类似的结果,但是cherrypy 会继续运行。

什么可能导致这个问题?我真的很感激任何帮助。干杯。

4

1 回答 1

2

我对 Webware 并没有真正的经验,但是根据您的代码的外观,Webware 正在尝试使用 cgi.FieldStorage 来检索您的字段变量,但是 FieldStorage 无法获取长度,或者获取长度不正确(可能是因为Webware 为获取 Content-Length 标头所做的任何事情在您的 CherryPy WSGI 环境中都不起作用——默认实现会检索HTTP_CONTENT_LENGTH环境变量,并且 Webware 可能会做类似的事情),所以它正在读取然后挂起。在使用 CGI 时,我经常遇到类似的问题。

最好的解决方案是不使用 cgi.FieldStorage。如果有问题的 HTTPRequest 对象来自 Webware,我的建议是将您的站点完全移植到 CherryPy(或其他一些 Web 框架),或者只在其本地环境中使用 Webware。破解某些东西是可能的,但是 WSGI 与 Webware 自己的应用服务器的本地环境非常不同。

于 2010-01-06T03:40:23.930 回答