0

これは私の前の質問のフォローアップ質問です。こちらのサンプルアプリに続いて、画像をアバターとしてアップロードして表示しようとしています。

これは私が使用しているコードです:

upload.pyが持っている:

from google.appengine.api import images

class Upload(webapp.RequestHandler):
    def get(self):
    self.response.out.write("""
          <form action="/avatar-save" enctype="multipart/form-data" method="post">                
            <div><label>Avatar:</label></div>
            <div><input type="file" name="img"/></div>
          </form>
        </body>
      </html>""")

class AvatarSave(webapp.RequestHandler):
    def post(self):
        avatar = images.resize(self.request.get("img"), 32, 32)
        greeting.avatar = db.Blob(avatar)
        greeting.put()
        self.redirect('/')


application = webapp.WSGIApplication(
                                 [('/upload', Upload),
                                  ('/avatar-save', AvatarSave),
                                  ],
                                 debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

AvatarSave私の最初の質問は、実際に画像がデータストアに保存されていることを確認するにはどうすればよいですか?

私は画像を表示しようとしますhw.py

class MainPage(webapp.RequestHandler):
    def get(self):
    siteUser = users.get_current_user()
    greeting = None        
    if siteUser:
        greeting = ("Welcome, %s! (<a href=\"%s\">sign out</a>)" %
                    (siteUser.nickname(), users.create_logout_url("/")))
    else:
        greeting = ("<a href=\"%s\">Sign in or register</a>" %
                    users.create_login_url("/"))

    self.response.out.write(greeting)           

    query = User.all()
    query.order("-userScore")
    results = query.fetch(10)
    self.response.out.write("""<html><head><style>
                               body {font-size: small;
                                     font-family: Verdana, Helvetica, sans-serif;
                                    }</style>
                                    </head><body><ol>""")
    for result in results:
        self.response.out.write("<li>")
        self.response.out.write("<b>%s</b> %s " % (result.userName, result.userLatestComment))
        self.response.out.write("<div><img src='img?img_id=%s'></img>" % result.key())
        self.response.out.write("</li>")
    self.response.out.write("</ol></body></html>")


class Image (webapp.RequestHandler):
    def get(self):
        greeting = db.get(self.request.get("img_id"))
        if greeting.avatar:
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write(greeting.avatar)
    else:
        self.response.out.write("No image")


application = webapp.WSGIApplication(
                                 [('/', MainPage),
                                  ('/img', Image),
                                  ],
                                 debug=True)

しかし、私が得るのは、表示された各行の壊れた画像のリンクアイコンだけです。(8行表示しています。)

ログには次のように表示されます。

INFO     2010-12-04 01:03:57,641 dev_appserver.py:3283] "GET / HTTP/1.1" 200 -
INFO     2010-12-04 01:03:57,703 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBMM HTTP/1.1" 200 -
INFO     2010-12-04 01:03:57,756 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBUM HTTP/1.1" 200 -
INFO     2010-12-04 01:03:58,734 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBIM HTTP/1.1" 200 -
INFO     2010-12-04 01:03:58,812 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGFkM HTTP/1.1" 200 -
INFO     2010-12-04 01:03:58,878 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGFsM HTTP/1.1" 200 -
INFO     2010-12-04 01:03:58,934 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGFoM HTTP/1.1" 200 -
INFO     2010-12-04 01:03:58,986 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGGkM HTTP/1.1" 200 -
INFO     2010-12-04 01:03:59,040 dev_appserver.py:3283] "GET /img?img_id=ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGGwM HTTP/1.1" 200 -
INFO     2010-12-04 01:04:00,102 dev_appserver.py:3283] "GET /favicon.ico HTTP/1.1" 200 -

私の知る限り、一部の画像はデータストアから取得されます。しかし、アップロードした画像は1つだけです(またはアップロードしたと思いました)が、ログによると、各画像のIDは異なります。

誰かが私がここで何が起こっているのかを理解するのを手伝ってもらえますか?そしてそれを修正する方法は?助けてくれて本当にありがとうございます。


アップデート

ベンの答えに応えて、私は次のようにコードを更新しました。

これは私が使用しているモデルです:

class User(db.Model):
    userEmail = db.StringProperty()
    ....
    avatar = db.BlobProperty()

そしてこれは新しいAvatarSaveです:

class AvatarSave(webapp.RequestHandler):
    def post(self):
        q = User.all()
        q.filter("userEmail =", "az@example.com")
        qTable = q.fetch(1)
        if qTable:
            for row in qTable:
            avatar = images.resize(self.request.get("img"), 32, 32)
            row.avatar = db.Blob(avatar)
            db.put(qTable)
        else:
            self.response.out.write("user not found")

        self.redirect('/')

これで、に関連付けられているユーザーのアバターが更新されると思いますuserEmail "az@example.com"。これは正しいです?

hw.pyこのユーザーのみを表示するように更新しました。

query = User.all()
    query.filter("userEmail =", "az@example.com")
    results = query.fetch(1)
    self.response.out.write("""<html><head><style>
                               body {font-size: small;
                                     font-family: Verdana, Helvetica, sans-serif;
                                    }</style>
                                    </head><body><ol>""")
    for result in results:
        self.response.out.write("<li>")
        self.response.out.write("<b>%s</b> %s " % (result.userName, result.userLatestComment))
        self.response.out.write("<div><img src='img?img_id=%s'></img>" % result.key())
        self.response.out.write("</li>")
    self.response.out.write("</ol></body></html>")

"None"しかし、画像を表示する代わりに、画像のリンクが壊れているため、まだ問題があります。

さらに、を見ると、列が表示されDatastore Viewerません。"avatar"しかし、ある時点でいくつかのブロブが更新されたことがわかります。

Entity Kind: __BlobUploadSession__
Key: ag10ZWxs....
ID: 125
Key Name:
creation: 1291388993.27
state: init
success_path: /upload

ここで何が起こっているのか、そしてそれを修正する方法がわかりません。どんな提案でも歓迎します。

4

1 に答える 1

1

ログには、データストアから最大10個のユーザーオブジェクトをリクエストしているため、さまざまな画像IDが表示されます。また、データストアクエリは、画像が保存されているかどうかに関係なく、ユーザーを検索します(8人のユーザーを作成した可能性があります)。テスト中のオブジェクト)。

アバターが保存されない理由について:

class AvatarSave(webapp.RequestHandler):
    def post(self):
        avatar = images.resize(self.request.get("img"), 32, 32)
        greeting.avatar = db.Blob(avatar)

例からいくつかのコードが欠落していない限り、「greeting」変数はここでは設定されません。最初に新しいグリーティングを作成するか(使用するモデルの新しいインスタンスを作成することにより)、適切なものをロードしてから、アバターをそれに設定してから、greeting.put()を実行する必要があります。

アップデート

コードが次のようにインデントされている場合:

    qTable = q.fetch(1)
    if qTable:
        for row in qTable:
        avatar = images.resize(self.request.get("img"), 32, 32)
        row.avatar = db.Blob(avatar)
        db.put(qTable)

うまくいかないだろう。あなたが欲しいのはおそらく:

    qTable = q.fetch(1)
    if qTable:
        for row in qTable:
            avatar = images.resize(self.request.get("img"), 32, 32)
            row.avatar = db.Blob(avatar)
        db.put(qTable)

ただし、ここでは1つのオブジェクトのみを操作しているため、fetch(1)の現在の使用を置き換えて、代わりに次のようにする方が簡単です。

    currentUser = q.get()
    if currentUser is not None:
        avatar = images.resize(self.request.get("img"), 32, 32)
        currentUser.avatar = db.Blob(avatar)
        currentUser.put()
于 2010-12-04T01:33:52.493 に答える