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 に答える