-1

+++ 它正在工作 - 请参阅底部的解决方案 +++

我是 Google App Engine 和 Python 的相对新手。

我在我的程序中处理了一些大文本内容(变量中的内容,而不是外部文件中的内容)。GAE 不允许我写入文件,所以我想将它们存储在 blobstore 中。我可以在 GAE 和 Python 中做到这一点吗?如果是这样,如何?

一个示例代码片段将不胜感激。

谢谢。

+++更新问题+++

我尝试按照您提供的链接中的示例进行操作,该链接由示例修改:http: //blog.notdot.net/2010/03/Implementing-a-dropbox-service-with-the-Blobstore-API-Part-1启用在数据存储中保存 blobstore 键。当需要检索文件(这是一个 html 文件)时,我想使用 TemplateName 检索 BlobKey。

我最终得到了这样的结果:

在models.py我有:

class GeneratedFiles(ndb.Model):
  TemplateName = ndb.StringProperty()
  BlobKey = blobstore.BlobReferenceProperty()
  Status = ndb.StringProperty(default="Pending Translation")

在一个类中,在一个 .py 文件中,我有:

class TokenFileGen(BaseHandler):
    def get(self):
        template = jinja_environment.get_template(FileName)     
        blobtext = template.render(tokenvals = tokendict)
        bloboutput = (blobtext.encode('utf-8'))
        # Create the file
        file_name = files.blobstore.create(mime_type='application/octet-stream')
        # Open the file and write to it
        with files.open(file_name, 'a') as fl:
            fl.write(bloboutput)
        # Finalize the file. Do this before attempting to read it.
        files.finalize(file_name)
        # Get the file's blob key
        blob_key = files.blobstore.get_blob_key(file_name)
        logging.info('QQQ: blob_key: %s' % blob_key)
        f = GeneratedFiles(
            TemplateName = templateName
            , BlobKey = blob_key                       
            , Status = 'Published'
            )
        f.put()
        ...

我得到一个 TypeError('Cannot set non-property %s' % name) TypeError: Cannot set non-property blob

我的日志记录语句返回以下内容:INFO 2012-09-21 05:20:24,177 token.py:551] QQQ: blob_key: vL117vQ4dlIPoUwXbREmbeqUnZU7nJ6ELMma8u1bFHGUfgEfOfS7HfAdFUvXc1EC

我以为我在相当密切地遵循这个例子。知道我怎样才能让它工作吗?

感谢您的任何帮助。

+++ 更新 2 +++

好的,我现在可以将 Blobstore 引用保存在以下模型中:

class GeneratedFiles(ndb.Model):
  TemplateName = ndb.StringProperty()
  BlobKey = ndb.BlobKeyProperty()

保存它的代码是:

file_name = files.blobstore.create(mime_type='application/octet-stream')
with files.open(file_name, 'a') as fl:
    fl.write(bloboutput)
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)
logging.info('QQQ: blob_key: %s' % blob_key)
f = GeneratedFiles(
    TemplateName = templateName
    , BlobKey = blob_key                       
    )
f.put()

我现在正在尝试检索和下载文件:

class FileDownloadHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, genfile_id):
        iden = int(genfile_id)
        file_info = ndb.Key('GeneratedFiles', iden).get()
        if not file_info or not file_info.BlobKey:
            self.error(404)
            return
        else:
            blob_key = file_info.BlobKey
        logging.info('QQQ: FileDownloadHandler/blob_key: %s' % blob_key)
        self.send_blob(blob_key, save_as=True)

我收到一个错误:ValueError:blob_key_or_info 的预期 BlobInfo 值。在最后一行。

就在错误消息之前,我得到了我的日志信息:

INFO     2012-09-21 19:19:44,219 genfile.py:131] QQQ: FileDownloadHandler/blob_key: sGxZRNu94u1kZ9ezpAeQFhyOLSZFYNX8RSAbXU78MLjjUKOohV0wyWnZZEQf6ScC

我发现了一些提到 URLencoding 和这个错误的参考资料。这可能是问题吗?如果是这样,在我的情况下 URLencoding 会是什么样子,我应该把它放在哪里(当我存储 blob_key 或从 ndb.datastore 检索 id 之后?

感谢您的任何帮助。

+++ 解决方案 +++

关键是更改 self.send_blob 语句如下(引用 blobstore 和 BlobInfo)。

self.send_blob(blobstore.BlobInfo(file_info.blob), save_as=True)

我还将属性 BlobKey 的名称更改为 blob(在我这样做后出现错误并且错误消失了,尽管我不明白为什么会有所作为)。

4

1 回答 1

1

查看写入 blobstore:https ://developers.google.com/appengine/docs/python/blobstore/overview#Writing_Files_to_the_Blobstore

您也可以为评论投票。

于 2012-09-19T16:57:39.913 回答