繁体   English   中英

如何在简单的python flask应用程序中组织芹菜任务?

[英]How to organize celery task in simple python flask app?

我有一个使用Celery的简单烧瓶应用程序。 现在,代码看起来像这样。

这是我的server.py,它位于根目录下

from flask import Flask, request, jsonify
import os
import json
import logging
import requests
import sys

app = Flask(__name__)

# app.debug = True
app.config.update(
    CELERY_BROKER_URL=config.get('REDISTOGO_URL'),
    CELERY_RESULT_BACKEND=config.get('REDISTOGO_URL'),
)
celery = make_celery(app)

@celery.task(bind=False, default_retry_delay=30)
def convert(gif_url, webhook):
    // Do some heavy lifting task

@app.route("/convert", methods=["POST"])
def convert():
    // Call the task

这是我的make_celery(app)

from celery import Celery


def make_celery(app):
    celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True

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

我感到困惑的原因是,如果将任务提取到另一个名为convert_task.py文件中,则该文件必须导入appmake_celery并且在应用程序中必须导入convert_task.py

我尝试了,我得到了

无法导入名称“ app”

什么是组织这种Python方式。 我们这样做的原因是我们将更多任务添加到server.py ,我不希望这成为一个上帝文件。

您可能正在获取循环导入

您可以通过执行以下任一操作来修复它:

  1. 将失败的导入移动到文件底部。

  2. 将导入移动到正在使用导入的函数中(不在模块的顶层)。

  3. 重新组织模块,以便convert_taskserver都从第三个模块导入,而第三个模块不从这两个文件中的任何一个导入。

如果仍然有问题,请发布文件的确切布局以及正在导入的内容。 用几行代码(不包括烧瓶/芹菜专用的东西)重现该问题应该很容易。

我一直在开发使用Celery的Flask应用,因此这是对我有用的:

  • make_celery在创建应用程序实例的同一文件中定义(在您的情况下看起来像server.py
  • 我的任务在单独的tasks.py中定义,该文件与server.py位于同一目录中。 这也是我实例化我的celery对象的地方(来自make_celery
  • 旋转芹菜工人时,请使用-A开关,然后为其提供指向task.py的路径。

希望对您有所帮助,如果您对我如何组织应用程序还有其他疑问,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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