【问题标题】:Django Serve Files From External Storage DirectlyDjango 直接从外部存储提供文件
【发布时间】:2019-01-29 07:13:42
【问题描述】:

我有一个基于 Google Cloud Platform 构建的 Django 项目。我们使用的是 Django 的身份验证系统,并且大多数(几乎所有)用户没有在 GCP 项目中设置了凭据,因此所有文件身份验证都需要基于 Django 而不是 GCP。

我们的文件存储后端配置很基础,文件按预期成功上传到GCS:

DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = 'my-bucket'

为文件生成的 URL 采用以下形式(同样,正如预期的那样):

https://storage.googleapis.com/my-bucket/my-document.txt

问题是这个存储桶不能公开可读,因为文件具有基于 Django 权限系统中设置的规则的访问控制,每个用户都不同。

如何让 Django 提供文件而不是 GCS 提供的文件?

想到的一个想法是拥有从 GCS 加载文件并将它们传递给请求客户端的视图,但我怀疑这不能很好地处理大文件,因为我需要将整个文件加载到本地内存中 ( bad) 或分块加载文件并将它们写入这些块中的响应流,但不知道这是否可以在 Django 中完成。

【问题讨论】:

标签: python django google-cloud-platform google-cloud-storage


【解决方案1】:

如果您的应用程序决定了对文件的访问(通过 Django 的身份验证系统),那么您必须执行您所描述的传递方法。

如果文件很大,您可以流式传输响应,而不是一次加载和发送整个响应 - 请参阅 django.http.StreamingHttpResponse

【讨论】:

  • 我最终写了一个替代的FileField,它创建并返回一个签名的 URL (cloud.google.com/storage/docs/access-control/signed-urls)。这具有为文件创建一个公开可见的端点的效果,但只能在短时间内使用。虽然不是完全安全(因为 URL 可以在有限的时间内共享),但它满足了我们的需求。
猜你喜欢
  • 2020-08-09
  • 2016-04-30
  • 1970-01-01
  • 2016-05-22
  • 2016-06-07
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多