我目前正在学习使用 Google App Engine ,我修改了this example看起来像这样:
import cgi
import webapp2
from google.appengine.api import users
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.out.write("""
<html>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>""")
class Guestbook(webapp2.RequestHandler):
def post(self):
cgi.test()
app = webapp2.WSGIApplication([('/', MainPage),
('/sign', Guestbook)],
debug=True)
因为我想看看cgi.test()
做了什么。它生成与 Python documentation 中的描述相匹配的输出。 ,但它错误地表示没有 POST 数据。此外,它还通知以下错误:
File "C:\Python27\lib\cgi.py", line 918, in test
print_environ(environ)
File "C:\Python27\lib\cgi.py", line 944, in print_environ
print "<DT>", escape(key), "<DD>", escape(environ[key])
File "C:\Python27\lib\cgi.py", line 1035, in escape
s = s.replace("&", "&") # Must be done first!
AttributeError: 'LogsBuffer' object has no attribute 'replace'
这是在本地主机开发环境上。为什么我得到的结果不正确?该示例指出,并非所有 Python 函数都被允许,但我怀疑 cgi.test()
会出现这种情况,不是吗?
编辑:我是否必须以某种方式更改 app.yaml
才能对 http://localhost:8080/sign
进行特殊处理?
最佳答案
问题在于 wsgi.errors(和 wsgi.input)的值是实际实例: 例如它是这样的:
'wsgi.errors': <google.appengine.api.logservice.logservice.LogsBuffer object at 0x105219150>
而不是它的字符串表示形式,转义方法只能在字符串上调用。
(肮脏的黑客)
找到文件 google/appengine/runtime/request_environment.py
(我不提供完整路径,因为我不知道您的安装位置),然后在第 111-112 行:
替换:
def __getitem__(self, key):
return self._request.environ[key]
与:
def __getitem__(self, key):
if key in ['wsgi.errors', 'wsgi.input']:
return str(self._request.environ[key])
return self._request.environ[key]
关于python - Google App Engine 中的 cgi.test(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130838/