我目前正在尝试删除遗留的python框架(webware 0.8.1)和它上面的分层软件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会继续运行。
可能导致此问题的原因是什么?我真的很感激任何帮助。欢呼声。
答案 0 :(得分:2)
我真的没有使用Webware的经验,但是基于代码的外观,Webware正在尝试使用cgi.FieldStorage来检索你的字段变量,但是FieldStorage无法获取长度,或者错误地获取长度(可能是因为无论Webware做了什么来使Content-Length头在CherryPy WSGI环境中都不起作用 - 默认实现检索HTTP_CONTENT_LENGTH
环境变量,而Webware可能会做类似hacky的事情),所以它正在读取然后它挂了。在使用CGI时,我经常遇到类似的问题。
最好的解决方案是不使用cgi.FieldStorage。如果有问题的HTTPRequest对象来自Webware,我的建议是将您的站点完全移植到CherryPy(或其他一些Web框架),或者只在其本机环境中使用Webware。黑客攻击可能是可能的,但WSGI与其自己的应用程序服务器的Webware本机环境非常不同。