[英]How to deploy a Django application with the Celery task on Heroku Free plan
I need to deploy my Django application which uses Celery on Heroku.我需要在 Heroku 上部署使用 Celery 的 Django 应用程序。 The website is already deployed and works fine, but the Celery worker cannot start.
该网站已经部署并且工作正常,但是 Celery 工作器无法启动。
Here is the output of the heroku logs -t -p celery
command:这里是
heroku logs -t -p celery
命令的 output:
2020-05-20T16:37:23.529208+00:00 heroku[celery.1]: State changed from starting to up
2020-05-20T16:37:26.576179+00:00 heroku[celery.1]: State changed from up to crashed
2020-05-20T16:37:26.580191+00:00 heroku[celery.1]: State changed from crashed to starting
2020-05-20T16:37:26.438750+00:00 app[celery.1]: Error:
2020-05-20T16:37:26.438775+00:00 app[celery.1]: Unable to load celery application.
2020-05-20T16:37:26.438776+00:00 app[celery.1]: Module 'forum' has no attribute 'celery'
My Procfile
:我的
Procfile
:
web: gunicorn --pythonpath forum forum.wsgi --log-file -
celery: celery worker -A forum -l info -c 4
forum/celery.py
file: forum/celery.py
文件:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'forum.settings')
app = Celery('forum')
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
forum/__init__.py
file: forum/__init__.py
文件:
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ('celery_app',)
Inside the forum/settings.py
file I have the following parameters related to Celery:在
forum/settings.py
文件中,我有以下与 Celery 相关的参数:
# REDIS related settings
REDIS_HOST = 'localhost'
REDIS_PORT = '6379'
CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
# for Heroku
CELERY_BROKER_URL = os.environ.get('REDIS_URL', 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0')
CELERY_RESULT_BACKEND = os.environ.get('REDIS_URL', 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0')
My Django project ( forum
) has several apps, and the registration
app is where my Celery task is located.我的 Django 项目(
forum
)有几个应用程序, registration
应用程序是我的 Celery 任务所在的位置。 So, the project has registration/tasks.py
file:所以,该项目有
registration/tasks.py
文件:
import logging
from forum.celery import app
@app.task
def send_verification_email(user_id):
pass
In registration/signals.py
I have the function for sending emails:在
registration/signals.py
signals.py 我有function 用于发送电子邮件:
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .tasks import send_verification_email
# send verification email when new user is registered
@receiver(post_save, sender=User)
def user_post_save(sender, instance, created, *args, **kwargs):
if created:
# Send verification email
send_verification_email.delay(instance.pk)
I'm going to use free Heroku dynos (since this is just my pet project for learning).我将使用免费的 Heroku 测功机(因为这只是我的学习宠物项目)。 But I suspect that the reason is not in the Heroku pricing plan but in the wrong configuration of the
Procfile
.但我怀疑原因不在 Heroku 定价计划中,而是在
Procfile
的错误配置中。
Heroku Redis addon is up and running. Heroku Redis 插件已启动并正在运行。
However, I tried to change the Procfile
in many ways, but the result is the same - Celery worker cannot start, it crashes.但是,我尝试通过多种方式更改
Procfile
,但结果是一样的 - Celery worker 无法启动,它崩溃了。 On my local machine Celery works perfectly.在我的本地机器上 Celery 工作得很好。 I run Celery by the following command (assuming that I started Redis server earlier by the
redis-server
command):我通过以下命令运行 Celery(假设我之前通过
redis-server
命令启动了 Redis 服务器):
celery worker -A forum --loglevel=debug --concurrency=4
Can somebody help me, please, with this issue?有人可以帮我解决这个问题吗?
The problem was with the wrong structure of the entire Django application.问题在于整个 Django 应用程序的结构错误。 I had something similar to this:
我有类似的东西:
pet
|-- forum
| |-- forum
| | |-- __init__.py
| | |-- celery.py
| | |-- wsgi.py
| | |-- asgi.py
| | |-- settings.py
| | |-- urls.py
| |-- app1
| |-- app2
| |-- appN
| |-- manage.py
| |-- Procfile
| `-- requirements.txt
The pet/forum/
folder was redundant. pet/forum/
文件夹是多余的。 The forum
folder that contains files as settings.py
or celery.py
should be directly placed under the pet
folder, on the same level as folders for all other apps.包含
settings.py
或celery.py
文件的forum
文件夹应直接放在pet
文件夹下,与所有其他应用程序的文件夹处于同一级别。
Also, after these changes I needed to modify the Procfile
:此外,在这些更改之后,我需要修改
Procfile
:
web: gunicorn forum.wsgi --log-file -
celery: celery worker -A forum -l info -c 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.