+++動作しています-下部の解決策を参照してください+++
私はGoogleAppEngineと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を設定できません'%name)TypeError:プロパティ以外の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
このエラーに関連してURLエンコードについて言及している参照をいくつか見つけました。これが問題でしょうか?もしそうなら、私の場合、URLエンコードはどのようになり、どこに配置すればよいですか(blob_keyを保存するとき、またはndb.datastoreからidを取得した後)。
助けてくれてありがとう。
+++ソリューション+++
重要なのは、self.send_blobステートメントを次のように変更することでした(blobstoreとBlobInfoを参照)。
self.send_blob(blobstore.BlobInfo(file_info.blob), save_as=True)
また、属性BlobKeyの名前をblobに変更しました(エラーが発生し、これを実行するとエラーが解消されましたが、なぜそれが違いを生むのかわかりません)。