Display Blob Images in Python (App Engine)

I can’t get the image to display on the page. I can store it just fine.

These are the handlers:

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')

db has the following form:

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()

The form:

<form enctype="multipart/form-data" method="post">
       <input type="file" name="img" />
</form>

My bit of code template replacement:

<img src="/disp?key={{image}}" /></img>
+5
source share
3 answers

First, I think you are mixing the image key and binary image data.

Template

You must write the image key (string) to your template:

 <img src="/disp?key={{image_key}}" />

i.e. your last html should look like this if you just pass image.key () to your template:

 <img src="/disp?key=AC3CK3333KCCK2K213" />

. . html . .

(Btw, , html- <img ... /> <img ...></img>, <img .../></img>)

disp_image . , , , "/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=... URL , .

+2

. 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 = ) URL HTML- .

+2

I'm not sure, but I think you should not return from the get method in the class 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")

Could you explain what caused the rendering of the template? Where do you pass the attribute image?

+1
source

All Articles