5

ページに画像を表示できません。うまく保管できます。

これらはハンドラーです:

class disp_image(webapp.RequestHandler):
    def get(self):
        key = self.request.get('key')
        image = Images.get(key)
        if image:
            self.response.headers['Content-Type'] = "image/png"
            return self.response.out.write(images.image)
        else:
            self.response.headers['Content-Type'] = "image/png"
            return self.response.out.write("/static/unknown.gif")

class Profile(MainHandler):
    def get(self):      
        if self.user:
            self.render('profile.html', username = self.user.name, email = self.user.email, first_name = self.user.first_name, last_name = self.user.last_name, country = self.user.country, prov_state = self.user.prov_state, city_town = self.user.city_town)
        else:
            self.redirect('/register')

class Change_Profile_Image(MainHandler):
    def get(self):
        if self.user:
            self.render('change_profile_image.html', username = self.user.name, firstname=self.user.first_name)
        else:
            self.render('change_profile_image.html')

    def post(self):
        images = Images()
        imageupl = self.request.get('img')
        images.image = db.Blob(imageupl)
        images.put()
        self.redirect('/profile')

dbのものは次のとおりです。

class Images(db.Model):
    image = db.BlobProperty()

class User(db.Model):
    name = db.StringProperty(required=True)
    pw_hash = db.StringProperty(required=True)
    email = db.StringProperty(required=True)
    first_name = db.StringProperty()
    last_name = db.StringProperty()
    country = db.StringProperty()
    prov_state = db.StringProperty()
    city_town= db.StringProperty()
    clan= db.StringProperty()
    handle= db.StringProperty()

フォーム:

<form enctype="multipart/form-data" method="post">
       <input type="file" name="img" />
</form>

コードの私のテンプレート置換ビット:

<img src="/disp?key={{image}}" /></img>
4

3 に答える 3

2

自分で画像を提供する必要はありません。グーグルは無料でグーグル高性能画像サービングで仕事をすることができます!参照:https : //developers.google.com/appengine/docs/python/images/functions get_serving_url(blob_key、size = None、crop = False、secure_url = None)ここで、サービングURLを1回取得して保存するだけで済みます。 ImagesモデルクラスのHTMLテンプレートで使用します。

于 2012-07-19T00:16:48.393 に答える
2

1つは、画像キーと画像バイナリデータを混同していると思います。

テンプレート

テンプレートに画像キー(文字列)を書き込む必要があります。

 <img src="/disp?key={{image_key}}" />

つまり、image.key()をテンプレートに渡すだけで、最終的なhtmlは次のようになります。

 <img src="/disp?key=AC3CK3333KCCK2K213" />

あなたはそれを2段階のプロセスと考えることができます。テンプレートをレンダリングします。ユーザーブラウザはhtmlをレンダリングし、画像ハンドラにアクセスします。次に、イメージハンドラーがバイナリデータを送信します。

(ところで、私はあなたがあなたのhtmlタグを両方ではなくどちらかで<img ... />閉じるという印象を受けました)<img ...></img><img .../></img>

画像ハンドラー

画像ハンドラーdisp_imageで、画像のバイナリデータを返す必要があります。最初の条件は問題ないように見えますが、else条件では、gifファイルの実際のバイナリデータではなく、テキスト「/static/unknown.gif」が返されるだけだと思います。

    else:
        self.response.headers['Content-Type'] = "image/png"
        return self.response.out.write("/static/unknown.gif")

unknown.gifをデータストアに保存してキーで参照するか"/static/unknown.gif"、代わりにテンプレートにURLを書き込む必要があります。"/disp?key=..."

最後に、画像ハンドラーが機能しているかどうかをテストする最も簡単な方法は<domain>/disp?key=...、ブラウザーのURLバーに接続すると、目的の画像が読み込まれるはずです。

于 2012-07-21T06:13:30.687 に答える
1

disp_imageよくわかりませんが、クラスのgetメソッドから戻るべきではないと思います。

class disp_image(webapp.RequestHandler):
    def get(self):
        key = self.request.get('key')
        image = Images.get(key)
        if image:
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write(images.image)
        else:
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write("/static/unknown.gif")

テンプレートレンダリングはどこから呼び出されているのか説明していただけますか?属性をどこに渡しimageますか?

于 2012-07-18T22:00:00.777 に答える