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()
我真的卡在这个问题上了,因为我不确定从哪里开始:
我的 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()