芹菜忽略配置值

时间:2017-12-08 01:18:55

标签: python python-3.x flask celery

由于某种原因,Celery似乎忽略了我的配置值。我在我的应用config.py

中设置了以下值
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_RESULT_ENGINE_OPTIONS = {"pool_recycle": 7200, 'echo': True}
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}

然而,芹菜继续尝试连接到以下经纪人网址amqp://guest:**@localhost:5672//

这是我尝试配置芹菜的地方

def configure_extensions(app):
  # flask-sqlalchemy
  db.init_app(app)

  # marshmallow
  ma.init_app(app)

  # bcrypt
  bcrypt.init_app(app)

  #celery
  celery.config_from_object(app.config)

这是我的extensions.py

# Flask-SQLAlchemy extension instance
from flask_sqlalchemy import SQLAlchemy
# flask_marshmallow extension instance
from flask_marshmallow import Marshmallow
# Bcrypt
from flask_bcrypt import Bcrypt
# flask_restful
from flask_restful import Api
#celery
from celery import Celery

celery = Celery()

db = SQLAlchemy()

ma = Marshmallow()

bcrypt = Bcrypt()

api = Api()

我在调用app.config之前打印出celery.config_from_object(app.config),它确实包含了我在上面列出的芹菜值。我已经看过堆栈溢出的类似帖子,还没找到一个回答我问题的帖子。

我正在使用python 3.6和芹菜4.1

有谁知道为什么忽略配置值?我已经检查了celery docs,我认为我正在使用正确的配置值

这是指向最小示例存储库Github Repo

的链接

4 个答案:

答案 0 :(得分:1)

Celery在Flask和应用程序工厂模式方面存在问题。 Miguel Grinberg写了一篇很棒的博客文章:

https://blog.miguelgrinberg.com/post/celery-and-the-flask-application-factory-pattern

基本上,您需要在创建时传入代理URL,而不是推迟它并稍后更新配置。

我修改了你的app/extensions.py

from celery import Celery                                                       

from . import celeryconfig                                                      
celery = Celery(__name__, broker=celeryconfig.broker_url,                       
                backend=celeryconfig.result_backend) 

现在,经营芹菜工人会产生以下结果:

bash# celery worker -A app.extensions

transport:   redis://localhost:6379/0
results:     redis://localhost:6379/0

答案 1 :(得分:0)

您正在混合带前缀的未加前缀的配置密钥。

只使用不带celery前缀的小写。

还要确保实际使用配置文件。我不知道你的app是什么。对于可导入的config_file.py,请使用config_from_object('config_file')

答案 2 :(得分:0)

在Celery 4.0中,配置选项已更改为小写,有些已重命名。因此,您必须将配置参数更改为:

broker_url = 'redis://localhost:6379/0'
result_backend = 'redis://localhost:6379/0'
database_engine_options = {"pool_recycle": 7200, 'echo': True}
broker_transport_options = {'visibility_timeout': 3600}

有关详细信息,请参阅文档中的New lowercase settings部分。

答案 3 :(得分:0)

这对我有用:

app = Celery(
    'tasks',
    broker=f'sqs://{quote(CELERY_AWS_ACCESS_KEY_ID)}:{quote(CELERY_AWS_SECRET_ACCESS_KEY)}@',
)

app.conf.broker_transport_options = {
    'queue_name_prefix': f'{ENV}-',
    'region': 'eu-central-1',
}

https://github.com/celery/celery/blob/master/t/unit/app/test_app.py#L694

中所示