Google App Engine BlobProperty会返回陈旧内容

时间:2011-06-19 08:06:18

标签: python google-app-engine google-cloud-datastore

我将缩略图图像存储在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.pngimg1.png相同

然后我上传了另一张图片img2.png

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

然后以同样的方式检索它。我希望现在imgout.pngimg2.png相同。但相反,我发现它仍然是旧的img1.png。因此,Image查询返回过时的对象。打印图像长度的日志语句也验证第二次返回的图像不是更新的图像。

这里出了什么问题?

1 个答案:

答案 0 :(得分:3)

SaveImageHandler每次发布图片数据时,您正在创建一个新的Image实体,那么您只需使用该版本中的uid获取第一个图片{1}}

将其更改为“查找或创建”图像,如:

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属性,并查看get_or_insert方法