1

現在、次のように、特定の製品のアップロードされた画像を保存しています。

class Product(db.Model):
    images= db.ListProperty(db.Blob)
    # More properties ...

そして、私はそれらを取得します:

class ImageHandler(webapp2.RequestHandler):
    def get(self):
        productKey = cgi.escape(self.request.get('id'))

        if productKey:
            try:
                product = Product.get(db.Key(productKey))
                if product and product.images:
                    idx = 0 # if not img is passed, return the first one
                    imageIndex = cgi.escape(self.request.get('img'))
                    if imageIndex:
                        imageIndex = int(imageIndex)
                        if imageIndex > 0 and imageIndex < len(product.images):
                            idx = imageIndex

                    self.response.headers['Content-Type'] = 'image/jpeg'
                    self.response.out.write(str(product.images[idx]))
                    return
                self.redirect('/img/image-missing.jpg')
                return
            except:
                self.redirect('/img/image-404.jpg')
                return
        self.redirect('/img/image-404.jpg')

を呼び出すことによって/image?id={{productkey}}&img={{imageindex}}

現在検討中:

  • データストアのコスト
  • CPU/メモリ/時間のコスト
  • 別のアプリ/データストア、または amazon などへの移行の可能性があります。
  • サムネイル表示などのためにサイズ変更された画像を返す機能。
  • 考慮していないその他の要因

このままにしておくべきですか、それとも のみを含む画像用の別のモデルを用意しdb.BlobPropertydb.ListProperty(db.Key)代わりに製品モデルに を使用する必要がありますか?

画像を製品内のブロブとして保持すると、製品を get() したときに自動的にフェッチされるのか (これは悪いことです)、それとも別の画像エンティティを取得する必要がないためデータストアへのアクセスが減るのかはわかりません。

最後に、この python コード (多くのリダイレクト、リターン、および条件) を改善するための提案も歓迎します。ありがとうございました。

4

1 に答える 1

3

各データストア エンティティが 1MB のサイズにバインドされていると考えると、Blob のリストを 1 つのエンティティに格納するのは簡単に問題になる可能性があります。各画像を個別のモデルに保存し、製品モデルのキーのリストを保持することをお勧めします。

于 2012-11-17T18:18:07.587 に答える