Отображение изображений BLOB-объектов в Python (App Engine)
Я не могу получить изображение для отображения на странице. Я могу хранить это просто отлично.
Это обработчики:
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')
ДБ материал является следующим:
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>
3 ответа
Во-первых, я думаю, что вы смешиваете ключ изображения и двоичные данные изображения.
Шаблон
Вы должны записать ключ изображения (строку) в свой шаблон:
<img src="/disp?key={{image_key}}" />
т.е. ваш окончательный HTML должен выглядеть следующим образом, если вы просто передаете image.key() в шаблон:
<img src="/disp?key=AC3CK3333KCCK2K213" />
Вы можете думать об этом как о двухэтапном процессе. Вы предоставляете свой шаблон. Пользовательский браузер отображает html и получает доступ к вашему обработчику изображений. Затем обработчик изображения отправляет двоичные данные.
(Кстати, у меня сложилось впечатление, что вы закрываете свои HTML-теги либо <img ... />
или же <img ...></img>
, не оба <img .../></img>
)
Обработчик изображений
В вашем обработчике изображений disp_image вы должны возвращать двоичные данные изображения. Похоже, что ваше первое условие в порядке, но я думаю, что ваше условие else просто вернет текст "/static/unknown.gif", а не фактические двоичные данные файла 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=...
в адресную строку вашего браузера, он должен загрузить желаемое изображение.
Вы не должны обслуживать изображения самостоятельно. Google может сделать работу с Google High-Performance Image Serving бесплатно! См.: https://developers.google.com/appengine/docs/python/images/functions get_serving_url (blob_key, size = None, crop = False, secure_url = None), где вам нужно только один раз получить URL-адрес обслуживания и сохранить его. для использования в ваших шаблонах HTML в вашем классе модели изображений.
Я не уверен, но я думаю, что вы не должны возвращаться из метода get в disp_image
учебный класс.
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
атрибут?