Django直接从外部存储服务文件

时间:2018-08-23 00:19:17

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

我有一个在Google Cloud Platform上构建的Django项目。我们正在使用Django的auth系统,大多数(几乎所有)用户 均未在GCP项目中设置凭据,因此所有文件auth都必须基于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加载文件并将其传递给请求客户端的视图,但是我怀疑这不能很好地处理大文件,因为我需要将整个文件加载到本地内存中(错误)或将文件分块加载并将它们写到这些分块的响应流中,但不知道是否可以在Django中完成。

1 个答案:

答案 0 :(得分:0)

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

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