-1

+++動作しています-下部の解決策を参照してください+++

私は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に変更しました(エラーが発生し、これを実行するとエラーが解消されましたが、なぜそれが違いを生むのかわかりません)。

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 に答える