Я сохраняю уменьшенные изображения в объектах движка 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.Таким образом, запрос изображения, возвращал устаревший объект.Операторы журнала, которые печатают длину изображения, также проверяют, что изображение, возвращенное во второй раз, не является обновленным.
Что здесь не так?