【问题标题】:Django upload image to cdn using an APIDjango 使用 API 将图像上传到 CDN
【发布时间】:2023-11-29 18:47:02
【问题描述】:

我正在 Pythonanywhere.com 上用 Django 构建一个网站,我正在使用 Backblaze 的 B2 云存储来存储所有静态和媒体文件。我上传到 Backblaze 的 css 和图像正在运行,但我无法弄清楚所有内容应该如何组合在一起,所以这就是我所在的位置(最小化):

在这个模型中,我想存储一个缩略图,我有一个可以上传的表单。

class Post(models.Model):
    (...)
    thumbnail = models.ImageField(null=True, blank=True, width_field="width_field", height_field="height_field")
    (...)

Backblaze 包含我需要的 http 请求和响应的所有代码,所以我只是将它们粘贴到一个单独的文件中。我首先需要获得一个帐户授权令牌,然后是一个上传 url,然后我才能发送文件。

所以整个函数需要三个东西作为输入:文件日期、文件名和文件大小。作为输出,我得到了文件 ID(以及其他内容,详细信息 here)。

现在我想知道我需要在哪里调用该上传函数,我认为它与 ImageField 中的“upload_to”参数有关。而且我想知道 ImageField 中实际存储了什么,因为我没有告诉 ImageField 找到文件的位置。它是否使用设置文件中的媒体根目录,我该如何管理?

【问题讨论】:

  • 您的意思是您不想将图像存储在 PythonAnywhere 的磁盘上,而是希望将其存储在 backblaze 中?图像是您的用户提交的吗?或者您是否有预上传的图像,现在只想显示?
  • 正确,我想使用 Backblaze 作为 CDN。我已经预先上传了图片和 css/JavaScript 文件,我得到了这些工作。现在我确实想让用户上传图片并将它们存储在那里。
  • 查看 django-storages。它支持大多数存储后端(但不支持 backblaze)。似乎您只需要为后端实现读/写/关闭/大小方法,就可以了。您甚至可以提交拉取请求,让他们将其合并到上游!

标签: python django file-upload cdn


【解决方案1】:

在设置中使用这些命令,您可以设置 MEDIA_URL 以及图像的存储位置。这里的图片存放在 src/media_cdn

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media_cdn")

如果upload_to设置为None,你必须告诉upload_to应该将图像保存在media_cdn中的路径,否则它将把图像保存在media_cdn中。

models.ImageField(upload_to='profiles/')

您需要上传图片。因此,它包含图像存在的地址。

【讨论】:

  • 但是我相信我不能只让Django将图像保存到Backblaze的文件路径中。我需要为此使用 API 吗?
  • 我认为你在那里有你的工作空间,你可以在里面做任何事情,就像 heroku、amazon、azure 等一样。如果你不能这样做并且有 github 存储库。我想帮你。