1

このプラグインを使用して jquery で複数のファイルをアップロードしています。このプロジェクトは Django 用ですが、App Engine データストアを使用しようとしています。

デプロイに成功し、アップロードを試みるまでは機能します。エラー メッセージがサーバー ログに表示されます。

ValueError: App Engine ストレージ バックエンドは、ファイル属性が BlobstoreFile である BlobstoreFile インスタンスまたは File インスタンスのみをサポートします。

エラーは、models.py で django のモデル クラスを使用しているためだと思いますがmodels.FileField、AppEngine では が必要db.BlobProperty()です。

プロジェクトのリンクは次のとおりです: https://github.com/sigurdga/django-jquery-file-upload

ここに私のmodels.pyファイルがあります:

from django.db import models

class Picture(models.Model):

    # This is a small demo using FileField instead of ImageField, not
    # depending on PIL. You will probably want ImageField in your app.
    file = models.FileField(upload_to="pictures")
    slug = models.SlugField(max_length=50, blank=True)

    def __unicode__(self):
        return self.file

    @models.permalink
    def get_absolute_url(self):
        return ('upload-new', )

    def save(self, *args, **kwargs):
        self.slug = self.file.name
        super(Picture, self).save(*args, **kwargs)

それを修正するアイデアはありますか?ありがとう。

4

1 に答える 1

3

ここで注目すべき点がいくつかあります。これらは、App Engine の仕組みの核心に迫るものです。

Django のモデル層は、MySQL、SQLite、Postgres、Oracle などのリレーショナル データベースでのみ動作するように設計されています。

App Engine のデータストアは非リレーショナルであるため、Django モデルではネイティブに動作しません。ただし、 Django モデルと非リレーショナル データベース (データストアなど) の間の変換レイヤーとして機能するDjango-nonrelを使用することもできます。

残念ながら、Django の FileField は AppEngine の BlobProperty に正確に適合しないため、まだそれほど単純ではありません。回避策はありますが、Datastore は画像の提供には適していません。

画像の保存

Google では、画像などのファイルを保存および提供する方法として、BlobstoreGoogle Cloud Storageの 2 つの方法を推奨しています。

最終的に、アップロードされた画像を保存する最良の方法は、これらのいずれかに保存し、モデルに画像へのリンクを記録することです。したがって、モデルを次のように変更した場合:

class Picture(models.Model):

    file_url = models.URLField()
    slug = models.SlugField(max_length=50, blank=True)

    ...

ビューで、ここで説明する手法を使用してファイルを Blobstore にアップロードupload_urlし、モデルにfile_urlフィールドとして保存します。

Google Cloud Storage でも同じことができますが、Blobstore は実際には (別のサービスへの API ではなく) App Engine の一部であるため、以下で説明するさまざまな利点があります。

上記のように、これは Django-nonrel を使用する場合にのみ機能することに注意してください。そうしないと、Django モデルをデータストアに保存できません。

モデルの保存

Django-nonrel を使用すると、上記のモデルをそのままデータストアに保存できます。ただし、Django-nonrel には、慣れるまでに多くの注意点があり、非常に遅くなる可能性があります。個人的には新しいプロジェクトにはお勧めしませんが、他の人は同意しないかもしれません.

または、Django のモデル レイヤを回避して、Datastore に完全に適合するように設計されたApp Engine 独自のモデル レイヤを使用することもできます。Blobstore 内のオブジェクトを参照するための特定のプロパティ タイプが含まれています。モデルは次のようになります。

from google.appengine.ext.blobstore import blobstore
from google.appengine.ext import db

class Picture(db.Model):

    file = blobstore.BlobReferenceProperty()
    slug = db.StringProperty(required=False)

    ...

BlobReferenceProperty、このプロパティを介してファイル データ自体にアクセスし、ファイルに関するデータ (サイズなど) を取得したり、処理したりできるため、単に URL を保存するよりもはるかに強力です。URL を保存するだけでよければ、db.LinkPropertyDjango の に似たもありますmodels.URLField

もちろん、Django モデルの代わりに App Engine モデルを使用すると、Django のモデル レイヤの多くの利点と、Django との密接な統合が失われます。

Google クラウド SQL

Django モデルを使用したいが、Django-nonrel を使用したくない場合は、別のオプションがあります。非リレーショナル データストアの利点を諦めても構わない場合は、代わりにGoogle Cloud SQLを使用できます。Django は Cloud SQL をネイティブでサポートしています。ただし、Google Cloud SQL は現在限定プレビューであるため、アクセスが難しい場合があります。

Cloud SQL を使用することに決めた場合でも、イメージをパブリックに提供する場合は、上記のように Blobstore または Google Cloud Storage にイメージを保存する必要があります。

于 2012-05-20T16:00:09.887 に答える