1

我目前正在学习使用Google App Engine,我将这个示例修改为如下所示:

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 文档中的描述相匹配,但它错误地表示没有 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("&", "&amp;") # Must be done first!
AttributeError: 'LogsBuffer' object has no attribute 'replace'

这是在本地主机开发环境中。为什么我得到不正确的结果?该示例指出,并非所有 Python 函数都被允许,尽管我怀疑这会是这种情况cgi.test(),对吗?

编辑:我是否必须以app.yaml某种方式进行更改以允许特殊处理http://localhost:8080/sign

4

1 回答 1

1

问题是 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]
于 2012-08-26T16:49:53.870 回答