如何在GAE / Python的blobstore中存储文本?

时间:2012-09-19 16:43:20

标签: python google-app-engine

+++它正在运作 - 请参见底部的解决方案+++

我是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('无法设置非属性%s'%名称)TypeError:无法设置非属性blob

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

我以为我是在密切关注这个例子。知道如何才能让它发挥作用吗?

感谢您的帮助。

+++ update 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(在我执行此操作后出现错误并且错误消失了,但我不明白为什么会产生影响)。

1 个答案:

答案 0 :(得分:1)