【问题标题】:Django files storage: How to get base url of media file?Django 文件存储:如何获取媒体文件的基本 url?
【发布时间】:2018-02-08 14:38:12
【问题描述】:

我正在使用包装到 django-storages 逻辑中的 gcloud。我从来没有用我的存储桶的 url 路径提供服务:只提供了 DEFAULT_FILE_STORAGE 和 GS_BUCKET_NAME 这是我的 glcoud 项目和存储的名称。

我的问题是:如何获取图片的完整网址?我的图像使用相对 url 保存,这对数据库很有意义。但是我找不到任何关于如何获取对象存储的 django.core.files.storage 集合的基本 url 的正确文档。

一些文件存储对象要求一个有效的相对图像 url 以检索完整路径。但这不是我想要的:我只想(以编程方式)知道我(只有一个)存储桶的基本 url。模板{% image item.image %} 能够生成完整的 url,但从代码方面来看,它对我来说似乎完全模糊。

有什么帮助或建议吗?

【问题讨论】:

  • 您介意分享一下您为什么需要此信息吗?
  • 我正在编写我的 django 模型的 graphQL 实现。其中一些返回带有相对 url 的图像对象,但我需要重新创建完整的 url 路径。
  • 调用后端存储方法获取完整的URL怎么样?
  • Django default_storage 库能够重建它(当它保存或显示图像时)。我想知道这些信息是否不透明或易于访问,因为文档有点晦涩难懂。 gcloud 后端存储是一切,但不是透明的。尽管如此,default_storage 还是能够获取信息。
  • default_storage 在你的情况下是 gcloud 后端存储的一个实例。我猜这是Storage 的一个实例,所以你的API 可能应该序列化default_storage.url(item.image) 而不是item.image 的结果。

标签: django storage gcloud base-url


【解决方案1】:

获取完整的 URL 比获取前缀并加入一些端点存储的 URL 的相对部分更容易。

Django 文件存储后端的基类是Storage。这个类有一个url 方法,很可能在任何物有所值的云存储后端实现:

网址(名称)
返回可以访问 name 引用的文件内容的 URL。对于不支持通过 URL 访问的存储系统,这将引发 NotImplementedError。

因此,只需在您的 API 中序列化此方法的结果即可。例如,如果您的模型已经序列化为名为“data”的字典,您可以使用以下命令将“image”字段从相对更新为绝对:

relative_url = data.get("image")
full_url = relative_url and default_storage.url(relative_url)
data.update({"image": full_url})

【讨论】:

  • 为什么and 在第二行?应该是relative_url or default_storage.url(relative_url) 吗?
猜你喜欢
  • 2012-07-14
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2015-08-17
  • 2020-02-24
  • 2019-08-29
相关资源
最近更新 更多