【问题标题】:Getting error: Could not find session for *blob_key*出现错误:找不到 *blob_key* 的会话
【发布时间】:2013-03-17 12:27:15
【问题描述】:

我正在尝试制作一个用户可以上传文件的表单。我有一个表单,它接受用户参数并将它们发布到 UploadHandler 映射到作为参数传递给渲染函数的 url。它一直工作到它呈现表单,但是在提交文件时它会将我重定向到一个空白页面,并且控制台向我显示错误:

 ERROR    2013-03-17 11:53:30,769 dev_appserver_blobstore.py:404] Could not find session       for ahhkZXZ-a3Vyc3NhbW1hbmZhdHRuaW5nYXJyGwsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxgxDA
 INFO     2013-03-17 11:53:30,779 dev_appserver.py:3104] "POST /_ah/upload/ahhkZXZ-   a3Vyc3NhbW1hbmZhdHRuaW5nYXJyGwsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxgxDA HTTP/1.1" 404 -

我还是新手,但我似乎无法找到发生了什么。我知道映射以某种方式搞砸了,但我仍然不明白为什么它没有将我重定向到正确的处理程序(SummaryHandler)?

为文件上传提供表单的类:

class CreateHandler(BaseHandler):
def get(self):
    self.render('create.html', upload_url = blobstore.create_upload_url('/upload'))

html-form ('create.html'):

<h2 class="main-title">Upload a file!</h2>  
<form action="{{upload_url}}" method="post" enctype="multipart/form-data">
    <label>
        <div>Upload:</div> 
        <input type="file" name="file" accept="application/pdf"><br> 
    </label>
    <div class="error">
        {{file_error}}
    </div>
    <br>
    <input type="submit" name="submit" value="Submit"> 
 </form>

采用 args 形式的上传处理程序:

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
    upload_files = self.get_uploads('file')  
    blob_info = upload_files[0]

    #validation of form-vars
    have_error=False
    file_data=dict()
    if not (blob_info.content_type == 'application/pdf'):
        file_data['file_error']="You can only upload files in pdf-format."
        have_error=True
    if have_error:
        self.render('create.html', **file_data)
    else:
        #'parent' is just some stuff for organising the database. 
        #Not important in this context
        the_file = A_File(parent = summary_key(),   
                          file_key=str(blob_info.key()))
        the_file.put()
        if the_file:
            self.redirect('/summary/%s' % str(the_file.key().id()))
        else:
            _error="Could not find the file"
            self.render('welcome.html', error=_error)

应用程序处理程序及其映射:

app = webapp2.WSGIApplication([
(r'/', WelcomeHandler),
(r'/create', CreateHandler),
(r'/upload', UploadHandler),
(r'/summary/(\d+)', SummaryHandler) #I have not included this handler in the text
], debug=True)

【问题讨论】:

标签: python google-app-engine blobstore


【解决方案1】:

可能是此会话已过期或已被使用。使用create_upload_url 创建的网址有一个过期时间(我认为是 10 分钟)。在实际发布之前,您可能需要使用 JavaScript 刷新该 URL。

此外,如果由于某种原因文件已上传到 Blobstore,您将无法再次使用相同的 URL,它只适用于一个请求(但可能有多个文件)。

在您的示例中,尝试删除所有文件特定检查,尝试上传内容并通过数据存储查看器中的管理控制台检查您是否有任何 blob 或会话密钥。这可以通过这个 URL 访问:

 http://localhost:8080/_ah/admin/datastore

【讨论】:

  • 感谢您的回答,但我在 blobstore 中上传了 blob,并且可以找到对应于所有上传文件的 blobinfo 和 uploadblobsessions。我不明白的是,如果我不能再次使用相同的 url,如何从 blobstore 获取文件。如果你能指出我可以阅读它的方向,我会很高兴。
  • 方向在示例中:developers.google.com/appengine/docs/python/blobstore/… 当您想从 blobstore 获取文件时,您正在使用应该存储在某处的 blobkey。
  • 其实这就是我想要达到的目标。但问题是“upload_url = blobstore.create_upload_url('/upload')”行。我使用此 upload_url 作为表单的操作,与示例完全相同,但 UploadHandler 未映射到我得到的 url。在urlmapping中,我只有“/upload”而不是“/_ah/upload/*blobkey*。你认为我应该重写映射吗,虽然我在我见过的任何例子中都没有找到它。抱歉打扰你了带着这些新手问题...
  • @patriques 我猜你已经解决了......在我提供的链接中你应该找到所有答案。
  • 是的,谢谢。但真的不明白为什么它突然开始工作。有时候,事情就是这样发展的。 :-P。如果我可以问最后一个问题?现在它会在我需要时正确重定向我,但是当文件不是我在测试中要求的“如果不是(blob_info.content_type == 'application/pdf')”时,它不会将“welcome.html”页面呈现为我打算做到这一点。它只向我显示空页面和与以前相同的 url:localhost:8080/_ah/upload*blob_key*?你能弄清楚为什么。无论如何,感谢您的所有帮助。你太棒了。
猜你喜欢
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2018-06-20
  • 2019-02-08
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多