Webapp2を使用して配備されたGAE RequestHandlerのエラー

私はGoogle App Engine上でwebapp2フレームワークを使用しています。私のリクエストハンドラの1つで基本的なエラーが発生しています。

アプリケーションはローカルインスタンスでは正常に実行されていますが、Google App Engineのデプロイ済みバージョンでは次のトレースバックが発生します。

コードは次のとおりです:

import os
from google.appengine.ext.webapp import template
import webapp2
import logging 

class MainHandler(webapp2.RequestHandler):
    def get(self):
        logging.info('hi there 34')
        template_values = {}
        self.response.out.write('hello world 4')
        path = os.path.join(os.path.dirname(__file__), 'index.html')

        ## This is the code that causes the bug ##
        self.response.out.write(template.render(path, template_values))
        ## ## ## ##

debug = os.environ.get('SERVER_SOFTWARE', '').startswith('Dev')

app = webapp2.WSGIApplication(
    [(r'/main', MainHandler)], 
    debug = debug)

def main():
    app.run()

トレースバックエラー:

Traceback (most recent call last):

File "/base/python27_runtime/python27_dist/lib/python2.7/wsgiref/handlers.py", 
line 86, in run

self.finish_response()
File "/base/python27_runtime/python27_dist/lib/python2.7/wsgiref/handlers.py", 
line 127, in finish_response

self.write(data)

File "/base/python27_runtime/python27_dist/lib/python2.7/wsgiref/handlers.py", 
line 202, in write

assert type(data) is StringType,"write() argument must be string"

AssertionError: write() argument must be string

このエラーは何を意味しますか?

1

1 答え

私はレスポンスがユニコードのデータを受け取っていないと思うので、エンコードする必要があります最初:

content = template.render(path, template_values)
self.response.out.write(content.encode('utf-8'))

また、 Werkzeug をお勧めします。それはappengineでうまく動作し、人生をはるかに簡単にします。リクエストとレスポンスのデータ、URLルーティング、HTTP例外、オフライン開発用の優れたデバッガなどを扱うことができます。 Werkzeugは、すべてのPython Web Devをツールボックスに入れておく必要があると思います。

2
追加された
Jinja2はutf-8バイトストリングをサポートしていません。 Template.render は常にUnicode文字列を返します。あなたがuninode以外の文字列をuninode以外の文字列でjinjaテンプレートに渡すと、Unicodeエラーが発生します。
追加された 著者 Ski,
答えをありがとう。通常GAEでは、私はutf-8にエンコードする必要はありませんでした。あなたの答えは、しかし、私は応答のためにレンダリングされているHTMLファイルを考えさせてくれました。私のコードエディタは自動的にhtmlをutf-8にするためにHTMLマークアップを挿入しました。そして、それはhtmlファイルにそのマークアップがあったのは初めてであり、また私がこの特定のエラーを初めて見たときです。しかし、残念なことに、同じエラーがそのマークアップで繰り返されるかどうかはわかりません。そして、あなたが示唆したように、そしてそれなしで、エンコードします。私はそれが他の人に恩恵を受けることができる良い感情だと思ったので、私はあなたの答えをupvoted。他のアイデア?
追加された 著者 David Haddad,
レンダリングしたテンプレートの値を文字列にキャストして再試行しましたが、うまくいきました。しかし、私がこれをやらなければならないのは初めてのことなので、何が原因なのかはわかりません。通常私の以前のアプリケーションや、GAEのドキュメントのすべての例では、template.render(パス、値)はそのまま動作します。テキストをエンコードする方向で私に指摘してくれてありがとう!
追加された 著者 David Haddad,