+++ 它正在工作 - 请参阅底部的解决方案 +++
我是 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(在我这样做后出现错误并且错误消失了,尽管我不明白为什么会有所作为)。