heroku 上的 django:访问 s3 媒体以读取和处理媒体文件时,celery worker 被禁止访问 403

django on heroku: celery worker gets 403 forbidden when accessing s3 media to read and process media files

我真的卡在这个问题上了,因为我不确定从哪里开始:

我的 Django 项目允许用户上传电子表格,然后该应用程序会处理和汇总上传的数据。

使用标准表单和带有 FileField 的 Django 模型将文件上传到 MEDIA_URL。 上传后,celery worker 会访问文件并对其进行处理,将输出写入另一个模型。

这在本地运行良好,但在生产环境中不起作用。我正在部署到 heroku,并使用 cookiecutter-django 项目模板。我已经设置了一个 s3 存储桶并正在使用 django-storages 库。

文件上传没有问题 - 我可以在 Django 管理员以及 s3 存储桶中访问和删除它们。

然而,当 celery worker 试图读取文件时,我得到一个 HTTP Error 403: Forbidden。 我不确定如何解决这个问题,因为我不确定堆栈的哪一部分包含我的错误。可能是我的 tasks.py 模块、heroku:redis 插件或 settings.py 模块?

有必要告诉 celery 从哪里获取它的配置(使用哪个设置文件)。部署时我没有将配置更新为生产设置。

这是我的固定celery_app.py

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

app = Celery("<project_name>")

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object("django.conf:settings", namespace="CELERY")

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()