【问题标题】:Clarification of guide to Heroku Celery澄清 Heroku Celery 指南
【发布时间】:2020-03-12 00:45:25
【问题描述】:

我正在尝试找出可悲的指示here

在“配置 Celery 应用程序”部分下,我不确定我将代码放在哪里:

import os
app.conf.update(BROKER_URL=os.environ['REDIS_URL'],
            CELERY_RESULT_BACKEND=os.environ['REDIS_URL'])

非常感谢您对这些说明的任何澄清。

【问题讨论】:

    标签: python django heroku celery


    【解决方案1】:

    说明表明您应该将该代码放入您的 tasks.py 模块中。但是,对于多个包来说,这并不是完全可扩展的,每个包都有自己的 tasks.py 模块。我建议在与您的 settings.py 文件相同的目录中创建一个 celery.py 文件。

    # tasks.py
    import celery
    app = celery.Celery('example')
    app.conf.update(BROKER_URL=os.environ['REDIS_URL'],
                    CELERY_RESULT_BACKEND=os.environ['REDIS_URL'])
    

    或者您可以在settings.py 中指定您的设置并像这样配置 celery:

    # settings.py
    broker_url = os.environ['REDIS_URL']
    result_backend = os.environ['REDIS_URL']
    
    # celery.py
    from celery import Celery
    from celery.utils.collections import DictAttribute
    from celery.loaders.base import BaseLoader
    from django.conf import settings
    from django.apps import apps
    
    class ProjectLoader(BaseLoader):
        def read_configuration(self):
            """Load configuration from Django settings.
    
            This may not be needed to be honest. It's what I use in my project.
            """
            return DictAttribute(settings)
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
    # CELERY_LOADER must be set in the environment. Setting the ``loader``
    # kwarg for the app instance does _not_ do what we need it to.
    os.environ.setdefault("CELERY_LOADER", "project.celery:ProjectLoader")
    
    app = Celery("project")
    app.config_from_object("django.conf:settings")
    app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])
    
    # Procfile
    worker: celery worker --app=project.celery
    

    免责声明,其中一些配置需要针对您的项目进行调整。

    【讨论】:

    • 感谢您的回复。我现在,不断收到错误:从无 KeyError: 'REDIS_URL' from my tasks.py 中引发 KeyError(key)
    • fyi,我已经为 REDIS_URL 设置了 .env
    • 听起来您需要了解为什么该文件没有加载到您的环境中。
    【解决方案2】:

    以下是我制作minimal heroku/django/celery/redis 项目的步骤,以及here 的说明以及我在网上找到的其他资源。希望有人会发现这很有用。

    1. 在您的终端中,使用“heroku login”命令登录 Heroku CLI。

    2. “git clone https://github.com/heroku/python-getting-started.git”复制一个基本的django骨架项目到你的本地。

    3. 将 python-getting-started 重命名为任何内容。

    4. cd 到这个目录。

    5. 运行以下命令:“pip install -r requirements.txt” 注意:必须正确安装 Postgres 才能使此步骤正常工作。

    6. 运行以下命令:“python manage.py collectstatic”

    7. 在 Mac 上安装 redis:“brew install redis”

    8. 启动redis server: "redis-server&"(后面的&是作为后台进程运行)

    9. 测试 Redis 服务器是否正在运行:“redis-cli ping”。如果它回复“PONG”,那很好!

    10. 安装芹菜:“pip install celery”

    11. 使用以下代码在您的应用程序目录中创建一个 tasks.py 文件:

       from celery import Celery
      
       app = Celery('tasks', broker='redis://localhost:6379/0')
      
       @app.task
       def add(x, y):
           return x + y
      
    12. “cd ..”回到根目录。

    13. Run celery: "celery worker -A=location of tasks&"

    14. 在你的根目录中运行:“python manage.py shell”。

    15. 由于您的任务 celery 服务器已经启动,您现在可以通过导入 tasks.py 脚本来使用它来运行您的任务,例如从 Python 解释器交互模式:

      import hello.tasks
      hello.tasks.add.delay(1, 1)
      

    这应该返回一条异步消息。

    1. 将本地推送给 heroku master。

    ** 注意:如果您运行“celery worker -A=location of tasks.py&”并给出以下消息:

    consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 61]           
    Connection refused.
    

    尝试使用命令重启redis服务器:“brew services restart redis”


    你有它。一个最小的 heroku/django/celery/redis 项目!可以下载here.Instructions on how to deploy this to heroku.

    ** 注意:在工作项目中,“celery worker”命令已经包含在 Procfile 中。

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2011-08-23
      • 2015-11-24
      • 1970-01-01
      相关资源
      最近更新 更多