+++它正在运作 - 请参见底部的解决方案+++
我是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(在我执行此操作后出现错误并且错误消失了,但我不明白为什么会产生影响)。
答案 0 :(得分:1)
看看写给blobstore:https://developers.google.com/appengine/docs/python/blobstore/overview#Writing_Files_to_the_Blobstore
您也可以对评论进行投票。