1

私のプロジェクト (Python、Html、および Jinja2 を使用) では、各画像が映画データを含む特定のページにつながる映画の写真を含む home_page を持っています。動画データを含むページを表示しようとすると、次のエラーが発生します (moving.summary を削除するなどの各要素を削除しようとしましたが、エラーは上記のパラメーターでフラグが立てられました)。

    Traceback (most recent call last):
      File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__
        rv = self.handle_exception(request, response, e)
      File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__
        rv = self.router.dispatch(request, response)
      File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1278, in default_dispatcher
        return route.handler_adapter(request, response)
      File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1102, in __call__
        return handler.dispatch()
      File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 572, in dispatch
        return self.handle_exception(e, self.app.debug)
      File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch
        return method(*args, **kwargs)
      File "C:\Users\User\Desktop\imovie-good\main.py", line 77, in get
        self.response.out.write(template.render(template_values))
      File "C:\Program Files (x86)\Google\google_appengine\lib\jinja2\jinja2\environment.py", line 894, in render
        return self.environment.handle_exception(exc_info, True)
      File "C:\Users\User\Desktop\imovie-good\movie_data.html", line 7, in top-level template code
        <td> Movie Name: {{movie_data.name}}</td>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

これは私のpythonコードです:

    import webapp2
    import jinja2
    import os
    import datetime
    import time
    import cgi
    from google.appengine.ext import db
    from google.appengine.api import users
    from google.appengine.api import images


    jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))

    class Movie(db.Model):
        name = db.StringProperty()
        release_date = db.StringProperty()
        duration = db.StringProperty()
        director = db.StringProperty()
        actors = db.StringProperty(multiline=True)
        summary = db.StringProperty(multiline=True)
        picture = db.BlobProperty()
        trailer = db.StringProperty(multiline=True)
        date = db.DateTimeProperty(auto_now_add=True)

    class Movie_Data(webapp2.RequestHandler):
        def get(self):
            movie_key = self.request.get('movie_key')
            movie_data = Movie.get(movie_key)

    template_values = {'movie_data': movie_data}
            template = jinja_environment.get_template('movie_data.html')
            self.response.out.write(template.render(template_values))

    class Image(webapp2.RequestHandler):
        def get(self):
            movie = db.get(self.request.get('img_id'))
            if movie.picture:
                self.response.headers['Content-Type'] = 'image/jpeg'
                self.response.out.write(movie.picture)
            else:
                self.response.out.write("No Image")

    class Main(webapp2.RequestHandler):
        def get(self):
            movies = db.GqlQuery("SELECT * "
                                "FROM Movie "
                                "ORDER BY release_date DESC LIMIT 5")
            template_values = { 'movies': movies}                                   
            template = jinja_environment.get_template('home_page.html')
            self.response.out.write(template.render(template_values))

    class Admin(webapp2.RequestHandler):
        def get(self):
            template_values = {}
            template = jinja_environment.get_template('admin.html')
            self.response.out.write(template.render(template_values))


        def post(self):
            name = self.request.get('name')
            release_date = self.request.get('release_date')
            c = time.strptime(release_date,"%m/%d/%Y")
            release_date = time.strftime("%m%d%Y",c)
            duration = self.request.get('duration')
            director = self.request.get('director')
            actors = self.request.get('actors')
            summary = self.request.get('summary')
            picture = self.request.get('img')
            trailer = self.request.get('trailer')

            movie = Movie(key_name = name)
            movie.release_date = release_date
            movie.duration = duration
            movie.director = director
            movie.actors = actors
            movie.summary = summary
            movie.picture = db.Blob(picture)
            movie.trailer = trailer
            movie.put()
            self.redirect('/')



    app = webapp2.WSGIApplication([('/admin', Admin), ('/', Main), ('/img', Image), ('/movie_data', Movie_Data)], debug=True)

これは、home_page の私の html です。

    <html>
    <body>
        <table>
            <th>Top Movies</th>

            {% for movie in movies %}
            <tr>
                <td>{{movie.key().name() }} &nbsp</td>
            </tr>
            <tr>
                <td><a href = "/movie_data?movie_key = {{movie.key()}}"> <img src = "/img?img_id={{movie.key()}}"> </td>


            </tr>

            {% endfor %}

            <a href = "/admin">admin</a>

        </table>
    </body>
</html>

これは私の movie_data html コードです:

  <html>
    <body>
        <div>
            <table>
                <tr>
                    <td rowspan ="6">{{ movie_data.picture }}</td>
                    <td> Movie Name: {{movie_data.name}}</td> 
                </tr>
                <tr>
                    <td> Release Date: {{movie_data.release_date}}</td> 
                </tr>
                <tr>
                    <td> Duration (minutes): {{movie_data.duration}}</td> 
                </tr>
                <tr>
                    <td> Director: {{movie_data.director}}</td> 
                </tr>
                <tr>
                    <td> Actors: {{movie_data.actors}}</td> 
                </tr>
                <tr>
                    <td> Summary: {{movie_data.summary}}</td> 
                </tr>
                <tr>
                    <td colspan ="2"> {{movie_data.trailer}} </td>
                </table>
        </div>      
    </body>
</html>
4

2 に答える 2

1

文字列にもよるとは思いませんmovie_data.name。エラーを作成したエンティティが である可能性が高くなりますmovie_data.imageサービング BLOB のドキュメントに基づいて、関連するコードを確認します。

実際には、画像を提供するための別のハンドラが必要です。画像ドキュメントの例を参照するか、単に置き換えてください:

{{ movie_data.picture }} 

<img src='data:image/png;base64,{{movie_data.picture.encode("base64")}}'>
于 2013-01-23T12:37:59.613 に答える
0

Jinja2 は Unicode 専用です。レンダリング関数に ASCII 文字のみで構成される Unicode オブジェクトまたはバイト文字列を渡す必要があります

movie.nameだから、あなたはASCII以外の文字を含むバイト文字列だと思います。

次のいずれかをお勧めします。

a)データベース内にユニコードを保存する、または

b) テンプレート内でユニコードに変換します (Jinja2 でこれが可能かどうかはわかりません)。可能であれば、この構文は次のようになります。

<td> Movie Name: {{unicode(movie_data.name, "utf8")}}</td>

アプローチ a) を強くお勧めします。b) を使用する場合 (その構文が jinja テンプレート内でも有効である場合)、バイト文字列のエンコーディングを知る必要があります。

一般的な Python のヒントは、常に Unicode 文字列を使用することです。意味:

  1. 外部文字列入力をできるだけ早く Unicode に変換します (以下は HTML フォーム処理の例です)。これはデコードと呼ばれます。unicode(my_byte_string, encoding)(またはmy_byte_string.decode(encoding))。encoding「ascii」、「utf8」などにすることができます。
  2. Unicode をバイト文字列に変換する場合は、できる限り遅くします。ネットワーク経由で Unicode を転送したり、ファイルを書き込んだりする必要がある場合は、通常、バイト文字列に変換する必要があります。これはエンコーディングとして知られています。my_unicode_string.encode(encoding)
  3. ソース コード内で Unicode リテラルを使用します。movie.name = u"Iron Man"の代わりに使用movie.name = "Iron Man"

編集

Admin.postメソッド内のデータベースにムービーを保存しているようです。Unicode 値をデータストアに格納するには、次のようなコードを使用します。

name = unicode(self.request.get('name'), "utf8")
# and so on for all the StringProperty values

編集2

Python 2.7、Appengine Data Store & Unicode によると、 self.request.get("...")webapp または webapp2 を使用するときにデコードする必要はありません。

メソッド内にいくつかのアサートを配置しpostて、リクエストから取得した値が実際に Unicode であるかどうかを確認します。

assert isinstance(self.request.get("name"), unicode)

また、データ ストアから取得したオブジェクト プロパティが Unicode (Main.get 内) であることも確認します。

movies = db.GqlQuery("...")
assert all(isinstance(movie.name, unicode) for movie in movies)
于 2013-01-23T09:18:27.513 に答える