这是我previous question的后续问题。我正在尝试上传并在示例应用here之后将图像显示为头像。
这是我正在使用的代码:
在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都不同。
任何人都可以帮助我理解这里发生的事情;以及如何解决它?非常感谢你的帮助。
更新
在回复Ben's answer时,我更新了以下代码:
这是我正在使用的模型:
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"
列。但我发现某些blob在某些时候更新了:
Entity Kind: __BlobUploadSession__
Key: ag10ZWxs....
ID: 125
Key Name:
creation: 1291388993.27
state: init
success_path: /upload
不确定这里发生了什么,以及如何解决它。欢迎提出任何建议。
答案 0 :(得分:1)
在日志中,您看到的是不同的图像ID,因为您要从数据存储区请求最多10个用户对象,并且数据存储区查询正在查找用户,无论他们是否存储了图像(也许您在测试过程中制作了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)
但是因为你在这里只使用了一个对象,所以更换你当前使用的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()