首页 > 解决方案 > Flask + Celery 代理 redis 被覆盖

问题描述

class DevelopmentConfigLocalHost(Config):
    SQLALCHEMY_DATABASE_URI = 'sqlite:///tmp/temp.db'
    CELERY_BROKER_URL = "redis://localhost:6379/0"

这是非常简单的配置。至于我的工厂,我提供的是应用程序,而 celery 是全球性的。

_celery
def create_app():
    global _celery

在 create_app 工厂内为我的全局 _celery 提供 create_celery。还要确保配置正常工作。确实如此。

app.config.from_object(DevelopmentConfigLocalHost())
    print(app.config['CELERY_BROKER_URL'])
    CORS(app, resources={
        r'/document/*': {'origins': '*'},
        r'/*': {'origins': '*'},
    })
    celery = _celery = create_celery(app)

这是我直接来自烧瓶芹菜文档的非常基本的 create_celery 工厂。

def create_celery(app):
    celery = Celery(
        app.import_name,
        broker=app.config['CELERY_BROKER_URL']
    )

    celery.conf.update(app.config)

    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            with app.app_context():
               return self.run(*args, **kwargs)

    celery.Task = ContextTask

    return celery

如果重要的话。我正在通过 wls 运行 redis 服务器。在 wls 中安装了 redis 5.0.7。对于 venv,我使用的是 3.5.3。我正在使用这个命令来运行 celery:celery -A flaskr._celery worker

- ** ---------- .> app:         default:0x21648d3ca00 (.default.Loader)
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 12 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----

如您所见,正在使用 amqp 代替 redis。

 enter code hereconsumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//:

标签: pythonflaskrediscelery

解决方案


韦尔普。找到了答案。我不得不从 create_app() 返回 celery。我目前正在使用main,因为出于某种原因 py flaskr 不能与init一起使用。所以新命令是 celery -A flaskr。主要的 .celery 工人非常麻烦,但我必须凑合。同样关于任务,我无法执行从init导入全局变量的惯常结构。而是必须在 create_celery 中声明它们,或者我可以只从main导入


推荐阅读