できる、
私は、Django-nonrel で Blobstore を使用する際に同様の経験をしました。
最初の質問については、ブロブストアはやり過ぎではなく、プロジェクト全体を更新して再公開することなく画像をアップロードできる唯一の方法だと思います。サーバーの高度なレプリケーションとセキュリティのため、GAE ではディレクトリへの書き込みは許可されません。これは、需要の増加に応じてすべてのサーバーを自動的に起動できることとのトレードオフです。ディレクトリへの書き込みを伴う操作を行おうとすると、App Engine でエラーが発生します。
2番目の質問に対するより良い解決策を探しています。自分でファイルを名前で参照できるようにしたいと思います。私が考える重要な点は、保存時にファイル名に設定される「アップロード」モデルに追加の属性を追加することです。私はそれを試していませんが、うまくいくはずです。
アップデート:
これはうまくいきました。
モデルは次のとおりです。
class UploadModel(models.Model):
title = models.CharField(max_length=64, blank=True)
file = models.FileField(upload_to='uploads/%Y/%m/%d/%H/%M/%S/')
filename = models.CharField(max_length=100, editable=False, null=True, blank=True)
def save(self, *args, **kwargs):
self.filename = self.file.name.rsplit('/', 1)[-1]
super(UploadModel, self).save(*args, **kwargs)
ダウンロード ハンドラは次のとおりです。
def download_handler(request, filename):
upload = get_object_or_404(UploadModel, filename=filename)
return serve_file(request, upload.file, save_as=True)
URL マッピング:
url(r'^file/(?P<filename>.+)$', 'cms.views.download_handler_filename', name='cms-download_file'),
これを行うと、ファイル名でファイルにアクセスできます (これはサンプル アプリのスニペットにすぎません)。ご覧のとおり、「pk」は「filename」属性に置き換えられました。
{% url cms-download_file filename=upload.filename as fallback_url %}
<p><img src="{% firstof upload.file|public_download_url fallback_url %}"></p>
私が立ち往生しているのは、「public_download_url」をGAE Blobstoreで動作させることです。他の誰かが、パブリック URL を自動的に生成する適切なパブリックを機能させる方法についてコメントできる場合は、大いに感謝します。
許す