Отображение изображений 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 атрибут?

Другие вопросы по тегам