Flask/Celery:AttributeError(“无法腌制本地对象'celery_init_app。<locals>.FlaskTask'”)

问题描述 投票:0回答:1

python 3.10
venv
上运行于
Windows 10 pro

我正在尝试遵循

Celery
Flask
集成教程:https://flask.palletsprojects.com/en/latest/patterns/celery/

# example.py

from celery import Celery, Task
from flask import Flask


def celery_init_app(app: Flask) -> Celery:
    class FlaskTask(Task):
        def __call__(self, *args: object, **kwargs: object) -> object:
            with app.app_context():
                return self.run(*args, **kwargs)

    celery_app = Celery(app.name, task_cls=FlaskTask)
    celery_app.config_from_object(app.config["CELERY"])
    celery_app.set_default()
    app.extensions["celery"] = celery_app
    return celery_app


def create_app() -> Flask:
    app = Flask(__name__)
    app.config.from_mapping(
        CELERY=dict(
            # Redis Docker container connection string
            broker_url="redis://default:redispw@localhost:55000",
            result_backend="redis://default:redispw@localhost:55000",
            task_ignore_result=True,
        ),
    )
    app.config.from_prefixed_env()
    celery_init_app(app)
    return app
# make_celery.py

from example import create_app

flask_app = create_app()
celery_app = flask_app.extensions["celery"]

命令行调用:

celery -A make_celery worker --loglevel INFO

遇到:

Unrecoverable error: AttributeError("Can't pickle local object 'celery_init_app.<locals>.FlaskTask'")
[...]
.venv\lib\site-packages\billiard\reduction.py", line 123, in steal_handle
    return _winapi.DuplicateHandle(
PermissionError: [WinError 5] Access is denied

示例存储库上出现相同的错误和回溯: https://github.com/pallets/flask/tree/main/examples/celery

我该如何解决这个问题? 有哪些替代方案可用?

尝试将

class FlaskTask(Task)
移出
celery_init_app
函数的局部范围,但随后我显然失去了对
app
变量的访问权限。

python flask redis celery attributeerror
1个回答
5
投票

我遇到了同样的问题。将 celery_init_app 更改为这样可以修复它

celery_app = Celery(app.name)
celery_app.config_from_object(app.config["CELERY"])
celery_app.Task = FlaskTask

我希望我能解释一下“为什么”。如果有人知道请留言

© www.soinside.com 2019 - 2024. All rights reserved.