Cherrypy 在表单提交时挂起
我现在正在尝试去掉一个老旧的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请求的页面是没问题的。但是如果是包含POST请求的页面,比如登录页面,cherrypy就会卡在:
request = HTTPRequest(local_req)
这里调用了FieldStorage,而FieldStorage又会调用它的父类cgi.FieldStorage的构造函数。就是在这里,它最终卡住了。
不过,如果我在终端按下ctrl-c,它会继续处理,然后在页面成功加载后终止。所以在登录页面,我点击“登录”,它会卡住,然后我按ctrl-c,它就会让我登录成功,然后关闭cherrypy。
我发现如果我用cherrypy.engine.start而不是quickstart,它就不会启动任何信号处理程序。在这种情况下,结果会和之前的行为类似,但cherrypy会继续运行。
这个问题可能是什么原因造成的呢?我非常感谢任何帮助。谢谢。
1 个回答
我对Webware没有太多经验,但根据你的代码来看,Webware似乎在尝试用cgi.FieldStorage来获取你的字段变量。不过,FieldStorage可能无法正确获取长度,或者获取的长度不对(可能是因为Webware获取Content-Length头信息的方法在你的CherryPy WSGI环境中不管用——默认情况下,它是从HTTP_CONTENT_LENGTH
环境变量中获取的,而Webware可能也做了类似的处理),所以它在读取时就卡住了。我在使用CGI时也常常遇到类似的问题。
最好的解决办法是不要使用cgi.FieldStorage。如果你提到的HTTPRequest对象是来自Webware,我建议要么把你的网站完全迁移到CherryPy(或者其他Web框架),要么就直接在Webware的原生环境中使用它。虽然可能可以做一些变通,但WSGI和Webware自己应用服务器的原生环境差别很大。