[google-appengine] Re: Retrieving image from a Blob
Dear Both, Thanks a lot for your time. I have been away for a couple of weeks and did not have the time to follow up until today. I'll have a serious look at your info and will let you know if I manage to crack this nut. Thanks again -R On Sep 15, 2:29 am, John McLaughlin johnmclaugh...@massanimation.com wrote: @Robert. Right you are. I checked the docs and db.get is a magic get anything function. Sorry for the noise. So I'm going for door #2 now. In ServePhoto photo must be the correctly returned key. Otherwise accessing photo.photo would give an error. So photo.photo must truly be a false value. This means to me that although photo is a valid object, the photo.photo property never got set properly. This takes us back to UploadPhoto. It's unlikely that photo.put() failed. And it's likely that db.Blob created a valid db.Blob object. However accessing photo.photo doesn't return the db.Blob object, but rather the underlying data that came into it. Therefore I think your original hunch that the incoming data for db.Blob is an empty string is correct. I've struggled with multi-part posts so I'm not 100% sure about the html. One thing that looks suspicious is the hard coding of the hostname:port in the post action. Are you sure you don't want simply /uploadphoto? That could send the uploads to the wrong place, for example different ports use different datastores on the Dev Server. On Sep 14, 9:17 am, Robert Kluin robert.kl...@gmail.com wrote: db.get() will grab an entity of _any_ kind. Model.get checks that the key is for the correct kind of entity before fetching it. Either will work. When I use db.get I usually include a check to make sure the keys are the correct kind. The key he posted in his initial thread is a Photo. Robert On Tue, Sep 14, 2010 at 11:34, John McLaughlin johnmclaugh...@massanimation.com wrote: The one thing that looked off to me is that the line in ServePhoto photo = db.get(self.request.get(photo_id)) might want to be photo = Photo.get(self.request.get(photo_id)) I think db.get is a datastore method, not an inherited method from db.Model On Sep 13, 8:09 pm, Robert Kluin robert.kl...@gmail.com wrote: I glanced over your code, nothing really major jumped out at me. If you are not getting an exception in ServePhoto then the model is clearly getting created and successfully fetched. So, here are my first thoughts: Have you tried logging some debug info in the UploadPhoto and ServePhoto handlers? Specifically are you sure data is actually in the photo property and it is not just an empty string or something? Maybe you could try logging len(photo.photo) right before saving it, then again right after fetching it. What happens when you remove the if and simply return photo.photo? Robert class ServePhoto (webapp.RequestHandler): def get(self): photo = db.get(self.request.get(photo_id)) if photo.photo: self.response.headers['Content-Type'] = image/jpg self.response.out.write(photo.photo) else: self.error(404) -- Robert Kluin Ezox Systems, LLC On Sun, Sep 12, 2010 at 22:03, Raymond raymond.othenin-gir...@raydropin.com wrote: Hi All, I have been trying to understand how to upload and download images from to a Blobstore and have hit a wall. I have essentially made a modified version of the Guestbook example provided by google and modified it to suit my needs, I have tested the guestbook app as is and got it working, somehow somewhere I am making a simple mistake that frustrate every attempt at getting it working in my own code. I have stripped down my code to the essential in the hope of understanding what is wrong, but I am still stuck. What am I attempting to do ? Upload in a blobstore an image and display it in a web page. What is my code ? 1) My upload form served from a static page ... form action=http://192.168.0.196:8083/uploadphoto; enctype=multipart/form-data method=post divlabelAttempt at uploading a picture using a form/label/ deiv divinput type=file name=photo //div divinput type=submit value=Upload Photo //div /form ... 2) My db model : class Photo(db.Model): photo = db.BlobProperty() date = db.DateTimeProperty(auto_now_add=True) 3) The code uploading the photo and saving it in the blobstore class UploadPhoto(webapp.RequestHandler): def post(self): photo = Photo() img = self.request.get('photo') photo.photo = db.Blob(img) photo.put() 4) The code creating the web page displaying the images : class PhotoPage(webapp.RequestHandler): def get(self):
[google-appengine] Re: Retrieving image from a Blob
The one thing that looked off to me is that the line in ServePhoto photo = db.get(self.request.get(photo_id)) might want to be photo = Photo.get(self.request.get(photo_id)) I think db.get is a datastore method, not an inherited method from db.Model On Sep 13, 8:09 pm, Robert Kluin robert.kl...@gmail.com wrote: I glanced over your code, nothing really major jumped out at me. If you are not getting an exception in ServePhoto then the model is clearly getting created and successfully fetched. So, here are my first thoughts: Have you tried logging some debug info in the UploadPhoto and ServePhoto handlers? Specifically are you sure data is actually in the photo property and it is not just an empty string or something? Maybe you could try logging len(photo.photo) right before saving it, then again right after fetching it. What happens when you remove the if and simply return photo.photo? Robert class ServePhoto (webapp.RequestHandler): def get(self): photo = db.get(self.request.get(photo_id)) if photo.photo: self.response.headers['Content-Type'] = image/jpg self.response.out.write(photo.photo) else: self.error(404) -- Robert Kluin Ezox Systems, LLC On Sun, Sep 12, 2010 at 22:03, Raymond raymond.othenin-gir...@raydropin.com wrote: Hi All, I have been trying to understand how to upload and download images from to a Blobstore and have hit a wall. I have essentially made a modified version of the Guestbook example provided by google and modified it to suit my needs, I have tested the guestbook app as is and got it working, somehow somewhere I am making a simple mistake that frustrate every attempt at getting it working in my own code. I have stripped down my code to the essential in the hope of understanding what is wrong, but I am still stuck. What am I attempting to do ? Upload in a blobstore an image and display it in a web page. What is my code ? 1) My upload form served from a static page ... form action=http://192.168.0.196:8083/uploadphoto; enctype=multipart/form-data method=post divlabelAttempt at uploading a picture using a form/label/ deiv divinput type=file name=photo //div divinput type=submit value=Upload Photo //div /form ... 2) My db model : class Photo(db.Model): photo = db.BlobProperty() date = db.DateTimeProperty(auto_now_add=True) 3) The code uploading the photo and saving it in the blobstore class UploadPhoto(webapp.RequestHandler): def post(self): photo = Photo() img = self.request.get('photo') photo.photo = db.Blob(img) photo.put() 4) The code creating the web page displaying the images : class PhotoPage(webapp.RequestHandler): def get(self): self.response.out.write('htmlpre') self.response.out.write('h1DateTime Photo/h1') photos = db.GqlQuery(SELECT * FROM Photo ORDER BY date DESC LIMIT 10) for photo in photos: self.response.out.write('p%s ' % photo.date) self.response.out.write('img src=servephoto?photo_id=%s //p' % photo.key()) self.response.out.write('/pre/body/html') 5) The code serving the images : class ServePhoto (webapp.RequestHandler): def get(self): photo = db.get(self.request.get(photo_id)) if photo.photo: self.response.headers['Content-Type'] = image/jpg self.response.out.write(photo.photo) else: self.error(404) Everything seem to work until this last stage, I can select an image in my form, upload it, Something is written in Binary in the Blobstore. When I visit the page supposed to display the image I see all info but a broken image icon. I checked the source code and the HTML seem to be just fine, here it is with one record in the blobstore, I get the blob key which mena that there is a record with some binary stuff in it. htmlpreh1DateTime Photo/h1p2010-09-13 00:31:14.477698 img src=servephoto?photo_id=agt0ZXN0cmF5c3Bvc3ILCxIFUGhvdG8YWww //p/ pre/body/html I also know that the ServePhoto class is called and executed but it if photo.photo always return false and execute self-eror(404). I tried replacing this with a different error code and it always display the error code so I am sure the if statement get a false. My questions is, why would the if statement get a false if there is effectively an image in the blobstore (Proved by the fact that I can retrieve it's key) ? I am sorry for the long post, and hope I am not too confusing. Thanks for any hint that would get me on the right way and forgive me if the answer is obvious, I probably need new eyes. Raymond -- You received this message because you are subscribed to
Re: [google-appengine] Re: Retrieving image from a Blob
db.get() will grab an entity of _any_ kind. Model.get checks that the key is for the correct kind of entity before fetching it. Either will work. When I use db.get I usually include a check to make sure the keys are the correct kind. The key he posted in his initial thread is a Photo. Robert On Tue, Sep 14, 2010 at 11:34, John McLaughlin johnmclaugh...@massanimation.com wrote: The one thing that looked off to me is that the line in ServePhoto photo = db.get(self.request.get(photo_id)) might want to be photo = Photo.get(self.request.get(photo_id)) I think db.get is a datastore method, not an inherited method from db.Model On Sep 13, 8:09 pm, Robert Kluin robert.kl...@gmail.com wrote: I glanced over your code, nothing really major jumped out at me. If you are not getting an exception in ServePhoto then the model is clearly getting created and successfully fetched. So, here are my first thoughts: Have you tried logging some debug info in the UploadPhoto and ServePhoto handlers? Specifically are you sure data is actually in the photo property and it is not just an empty string or something? Maybe you could try logging len(photo.photo) right before saving it, then again right after fetching it. What happens when you remove the if and simply return photo.photo? Robert class ServePhoto (webapp.RequestHandler): def get(self): photo = db.get(self.request.get(photo_id)) if photo.photo: self.response.headers['Content-Type'] = image/jpg self.response.out.write(photo.photo) else: self.error(404) -- Robert Kluin Ezox Systems, LLC On Sun, Sep 12, 2010 at 22:03, Raymond raymond.othenin-gir...@raydropin.com wrote: Hi All, I have been trying to understand how to upload and download images from to a Blobstore and have hit a wall. I have essentially made a modified version of the Guestbook example provided by google and modified it to suit my needs, I have tested the guestbook app as is and got it working, somehow somewhere I am making a simple mistake that frustrate every attempt at getting it working in my own code. I have stripped down my code to the essential in the hope of understanding what is wrong, but I am still stuck. What am I attempting to do ? Upload in a blobstore an image and display it in a web page. What is my code ? 1) My upload form served from a static page ... form action=http://192.168.0.196:8083/uploadphoto; enctype=multipart/form-data method=post divlabelAttempt at uploading a picture using a form/label/ deiv divinput type=file name=photo //div divinput type=submit value=Upload Photo //div /form ... 2) My db model : class Photo(db.Model): photo = db.BlobProperty() date = db.DateTimeProperty(auto_now_add=True) 3) The code uploading the photo and saving it in the blobstore class UploadPhoto(webapp.RequestHandler): def post(self): photo = Photo() img = self.request.get('photo') photo.photo = db.Blob(img) photo.put() 4) The code creating the web page displaying the images : class PhotoPage(webapp.RequestHandler): def get(self): self.response.out.write('htmlpre') self.response.out.write('h1DateTime Photo/h1') photos = db.GqlQuery(SELECT * FROM Photo ORDER BY date DESC LIMIT 10) for photo in photos: self.response.out.write('p%s ' % photo.date) self.response.out.write('img src=servephoto?photo_id=%s //p' % photo.key()) self.response.out.write('/pre/body/html') 5) The code serving the images : class ServePhoto (webapp.RequestHandler): def get(self): photo = db.get(self.request.get(photo_id)) if photo.photo: self.response.headers['Content-Type'] = image/jpg self.response.out.write(photo.photo) else: self.error(404) Everything seem to work until this last stage, I can select an image in my form, upload it, Something is written in Binary in the Blobstore. When I visit the page supposed to display the image I see all info but a broken image icon. I checked the source code and the HTML seem to be just fine, here it is with one record in the blobstore, I get the blob key which mena that there is a record with some binary stuff in it. htmlpreh1DateTime Photo/h1p2010-09-13 00:31:14.477698 img src=servephoto?photo_id=agt0ZXN0cmF5c3Bvc3ILCxIFUGhvdG8YWww //p/ pre/body/html I also know that the ServePhoto class is called and executed but it if photo.photo always return false and execute self-eror(404). I tried replacing this with a different error code and it always display the error code so I am sure the if statement get a false. My questions is, why would the
[google-appengine] Re: Retrieving image from a Blob
@Robert. Right you are. I checked the docs and db.get is a magic get anything function. Sorry for the noise. So I'm going for door #2 now. In ServePhoto photo must be the correctly returned key. Otherwise accessing photo.photo would give an error. So photo.photo must truly be a false value. This means to me that although photo is a valid object, the photo.photo property never got set properly. This takes us back to UploadPhoto. It's unlikely that photo.put() failed. And it's likely that db.Blob created a valid db.Blob object. However accessing photo.photo doesn't return the db.Blob object, but rather the underlying data that came into it. Therefore I think your original hunch that the incoming data for db.Blob is an empty string is correct. I've struggled with multi-part posts so I'm not 100% sure about the html. One thing that looks suspicious is the hard coding of the hostname:port in the post action. Are you sure you don't want simply /uploadphoto? That could send the uploads to the wrong place, for example different ports use different datastores on the Dev Server. On Sep 14, 9:17 am, Robert Kluin robert.kl...@gmail.com wrote: db.get() will grab an entity of _any_ kind. Model.get checks that the key is for the correct kind of entity before fetching it. Either will work. When I use db.get I usually include a check to make sure the keys are the correct kind. The key he posted in his initial thread is a Photo. Robert On Tue, Sep 14, 2010 at 11:34, John McLaughlin johnmclaugh...@massanimation.com wrote: The one thing that looked off to me is that the line in ServePhoto photo = db.get(self.request.get(photo_id)) might want to be photo = Photo.get(self.request.get(photo_id)) I think db.get is a datastore method, not an inherited method from db.Model On Sep 13, 8:09 pm, Robert Kluin robert.kl...@gmail.com wrote: I glanced over your code, nothing really major jumped out at me. If you are not getting an exception in ServePhoto then the model is clearly getting created and successfully fetched. So, here are my first thoughts: Have you tried logging some debug info in the UploadPhoto and ServePhoto handlers? Specifically are you sure data is actually in the photo property and it is not just an empty string or something? Maybe you could try logging len(photo.photo) right before saving it, then again right after fetching it. What happens when you remove the if and simply return photo.photo? Robert class ServePhoto (webapp.RequestHandler): def get(self): photo = db.get(self.request.get(photo_id)) if photo.photo: self.response.headers['Content-Type'] = image/jpg self.response.out.write(photo.photo) else: self.error(404) -- Robert Kluin Ezox Systems, LLC On Sun, Sep 12, 2010 at 22:03, Raymond raymond.othenin-gir...@raydropin.com wrote: Hi All, I have been trying to understand how to upload and download images from to a Blobstore and have hit a wall. I have essentially made a modified version of the Guestbook example provided by google and modified it to suit my needs, I have tested the guestbook app as is and got it working, somehow somewhere I am making a simple mistake that frustrate every attempt at getting it working in my own code. I have stripped down my code to the essential in the hope of understanding what is wrong, but I am still stuck. What am I attempting to do ? Upload in a blobstore an image and display it in a web page. What is my code ? 1) My upload form served from a static page ... form action=http://192.168.0.196:8083/uploadphoto; enctype=multipart/form-data method=post divlabelAttempt at uploading a picture using a form/label/ deiv divinput type=file name=photo //div divinput type=submit value=Upload Photo //div /form ... 2) My db model : class Photo(db.Model): photo = db.BlobProperty() date = db.DateTimeProperty(auto_now_add=True) 3) The code uploading the photo and saving it in the blobstore class UploadPhoto(webapp.RequestHandler): def post(self): photo = Photo() img = self.request.get('photo') photo.photo = db.Blob(img) photo.put() 4) The code creating the web page displaying the images : class PhotoPage(webapp.RequestHandler): def get(self): self.response.out.write('htmlpre') self.response.out.write('h1DateTime Photo/h1') photos = db.GqlQuery(SELECT * FROM Photo ORDER BY date DESC LIMIT 10) for photo in photos: self.response.out.write('p%s ' % photo.date) self.response.out.write('img src=servephoto?photo_id=%s //p' % photo.key())