google blobstore 没有此类上传会话错误

No such upload session error with google blobstore

我正在尝试上传图片,然后在点击提交按钮时重定向到另一个页面。但是当我在浏览器中使用后退按钮并再次上传图像时,我得到一个 404 Not Found 找不到资源。没有这样的上传会话

我到处搜索以解决此问题,但找不到任何有效的解决方案。这是我的代码:

class PhotoUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        try:
            upload = self.get_uploads()[0]
            user_photo = Image(blob_key=upload.key())
            user_photo.put()
            self.redirect('/view_photo/%s' % upload.key())

        except:
            self.error(500)

class ViewPhotoHandler(Handler, blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, photo_key):
        if not blobstore.get(photo_key):
            self.error(404)
        else:
            image = images.get_serving_url(photo_key, size=None, crop=False, secure_url=None, filename=None, rpc=None)
            self.render('edit.html', image_key=image)

class MainHandler(Handler):
    def get(self):
        upload_url = blobstore.create_upload_url('/upload_photo')
        params = {'upload_url': upload_url,}
        self.render('imagify.html', **params)

返回后我可以上传图片的唯一方法是重新加载该页面。在不手动重新加载页面的情况下执行此操作的方法是什么?到处寻找之后,它看起来像是 blobstore 的问题。请帮忙

上传URL只有效一次,执行第一次上传后失效。 URL 的唯一性是 blobstore 为每个上传的文件生成唯一的 blob ID 所依赖的。

当您使用浏览器中的后退按钮并点击缓存表单的提交按钮时,您实际上是在重新使用之前上传会话的 URL,这就是您收到错误的原因。

当您重新加载页面时,将重新生成表单并包含新生成的上传 URL,可用于下一次上传。

我添加了这两行以在 MainHandler

中设置 headers
self.response.headers.add_header("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0")
self.response.headers.add_header("Expires","0")

我不再收到错误,但这只能部分解决问题。如果我使用后退按钮返回,则会启动一个新的 session,因此用户将不得不重新填写表格。但是不可能在用户返回时保留数据,然后在相同的 session 中提交具有相同数据的表单。此解决方案暂时可用。

使用Jquery刷新页面。

Force reload/refresh when pressing the back button

临时存储字段中的数据并在重新加载后填充。

How to get JS variable to retain value after page refresh?