可以,
我在将 Blobstore 与 Django-nonrel 结合使用时也有过类似的经历。
对于您的第一个问题,Blobstore 并不过分,我认为实际上这是您无需更新整个项目并重新发布即可上传图像的唯一方法。由于服务器的高复制和安全性,GAE 不允许您写入目录。随着需求的增加,能够自动启动所有服务器是一种权衡。如果您尝试执行任何涉及写入目录的操作,App Engine 将会出错。
我自己正在为您的第二个问题寻找更好的解决方案。我希望自己能够按名称引用文件。我认为关键是向“上传”模型添加一个额外的属性,该属性在保存时设置为文件名。我还没有尝试过,但它应该可以工作。
更新:
这行得通。
这是模型:
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(r'^file/(?P<filename>.+)$', 'cms.views.download_handler_filename', name='cms-download_file'),
完成此操作后,您可以按文件名访问文件(这只是示例应用程序中的一个 sn-p)。如您所见,“pk”被替换为“文件名”属性:
{% 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 的工作,我将不胜感激。
授予