简体   繁体   English

如何在 Heroku 免费计划上使用 Celery 任务部署 Django 应用程序

[英]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.pycelery.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM