【问题标题】:No such upload session error with google blobstoregoogle blobstore 没有这样的上传会话错误
【发布时间】:2015-12-27 11:08:44
【问题描述】:

我正在尝试上传图片,然后在点击提交按钮时重定向到另一个页面。但是当我在浏览器中使用后退按钮并再次上传图片时,我得到一个 404 Not Found The resource could not be 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 的问题。请帮忙。

【问题讨论】:

    标签: python google-app-engine blobstore webapp2


    【解决方案1】:

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

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

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

    【讨论】:

    • 很好解释,但我该如何解决这个问题?当用户回击时,我找不到任何方法来自动重新加载表单。当用户点击提交时,有什么办法可以删除以前的网址?
    • 可能帮助(也检查 cmets 和相关问题):stackoverflow.com/questions/18643810/…
    【解决方案2】:

    我添加了这几行来在 MainHandler 中设置标题

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

    我不再收到错误消息,但这只能部分解决问题。如果我使用后退按钮返回,则会启动一个新会话,因此用户将不得不再次填写表格。但是当用户返回并在同一个会话中使用相同的数据提交表单时,不可能保留数据。这个解决方案现在就可以了。

    【讨论】:

    • 您可以使用 jQuery 刷新 div 并在刷新和重新填充之前获取内容。这将使您开始刷新页面。
    【解决方案3】:

    使用 Jquery 刷新页面。

    Force reload/refresh when pressing the back button

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 2012-09-05
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      相关资源
      最近更新 更多