Как использовать изображения Python API правильно, чтобы отобразить аватар с комментариями пользователей?
-
08-10-2019 - |
Вопрос
Это следующий вопрос к моему предыдущий вопрос. Отказ Я пытаюсь загрузить и отобразить изображение в качестве аватара после пример приложения здесь.
Это код, который я использую:
В 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
Не уверен, что происходит здесь и как это исправить. Любое предложение будет приветствуется.
Решение
В журнале вы видите разные идентификаторы изображения, поскольку вы запрашиваете до 10 пользовательских объектов из хранилища данных, и запрос DataStore ищет пользователей независимо от того, есть ли у них хранимые изображения (возможно, вы сделали 8 пользователей объекты в процессе тестирования).
Что касается того, почему аватары не экономят:
class AvatarSave(webapp.RequestHandler):
def post(self):
avatar = images.resize(self.request.get("img"), 32, 32)
greeting.avatar = db.Blob(avatar)
Если какой-то код не отсутствует из вашего примера, «Приветствие» переменная здесь не устанавливается. Вы должны сначала создать новое приветствие (путем создания нового экземпляра любой модели, которую он использует) или загрузите соответствующую, затем установите его аватар, а затем приветствовать .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()