Google App Engine BlobProperty возвращает устаревший контент - PullRequest
1 голос
/ 19 июня 2011

Я сохраняю уменьшенные изображения в объектах движка Google App как BlobStoreProperties.Со временем миниатюры должны быть обновлены, что я и делаю, обновляя содержимое этих объектов свежими данными изображения.Однако я обнаружил, что любой последующий поиск этих изображений по-прежнему возвращает ту же старую копию, которая была сохранена впервые в объекте.Это удивительно противоречивое поведение.Я написал простой автономный код для проверки этого.

Вот два простых обработчика и определение модели.SaveImageHandler сохраняет изображение в хранилище данных, а LoadImageHandler получает его.

from google.appengine.ext import db
import logging

class Image(db.Expando):
 data = db.BlobProperty(required=True)
 uid = db.StringProperty(required=True) 

class SaveImageHandler(webapp.RequestHandler):                                
  def post(self, uid):                                                        
    imgdata = self.request.POST.get('imgdata').file.read()                    
    logging.error('Saving %d bytes'%(len(imgdata)))                           
    image = model.Image(data=imgdata, uid=uid)                                
    image.put()                                                               

class LoadImageHandler(webapp.RequestHandler):                                
  def post(self, uid):                                                        
    image = model.Image.gql('WHERE uid = :1', uid).get()                      
    self.response.headers['Content-type'] = 'image/png'                       
    logging.error('Loading %d bytes'%(len(image.data)))                       
    self.response.out.write(image.data)    

def application():
  return webapp.WSGIApplication([
    ('/_thumbsave/(.*)', SaveImageHandler),
    ('/_thumbload/(.*)', LoadImageHandler),
  ],debug=False)

def main():
  util.run_wsgi_app(application())

if __name__ == '__main__':
  main()

Я загружаю изображение, подобное этому

curl -F "imgdata=@/tmp/img1.png" http://ubuntu.local:8000/_thumbsave/X

Я получаю изображение

curl -d dummy=0 http://ubuntu.local:8000/_thumbload/X > Downloads/imgout.png

imgout.png и img1.png одинаковы

Затем я загружаю другое изображение img2.png

curl -F "imgdata=@/tmp/img2.png" http://ubuntu.local:8000/_thumbsave/X

Затем получаю его таким же образом, как указано выше.Теперь я ожидаю, что imgout.png будет таким же, как img2.png.Но вместо этого я обнаружил, что это все тот же старый img1.png.Таким образом, запрос изображения, возвращал устаревший объект.Операторы журнала, которые печатают длину изображения, также проверяют, что изображение, возвращенное во второй раз, не является обновленным.

Что здесь не так?

1 Ответ

3 голосов
/ 19 июня 2011

В вашем SaveImageHandler вы создаете новую сущность Image каждый раз, когда вы ПОСТАВЛЯЕТЕ данные изображения, затем вы просто извлекаете первое изображение с этим идентификатором в LoadImageHandler

Измените его на «найти или создать» изображение, например:

class SaveImageHandler(webapp.RequestHandler):
  def post(self, uid):
    image = Image.all().filter("uid =", uid).get()
    if not image:
        image = model.Image(uid=uid)
    image.data = self.request.POST.get('imgdata').file.read()
    image.put()

Вместо использования свойства uid, подумайте об использовании key_names для этой цели и взгляните на get_or_insert метод

...