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

时间:2015-07-30 15:22:32

标签: python flask celery

我使用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'

组织这个的pythonic方法是什么。这背后的原因我们将向server.py添加更多任务,我不希望它成为神文件。

2 个答案:

答案 0 :(得分:0)

您可能会获得circular import

您可以通过执行以下操作之一来解决此问题:

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

  2. 将导入移动到使用导入的功能(不在模块的顶层)。

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

  4. 如果您仍然遇到问题,请发布文件的确切布局以及导入内容的内容。使用几行代码(不包括烧瓶/芹菜特定的东西)重现问题应该很容易。

答案 1 :(得分:0)

我一直在开发一个使用Celery的烧瓶应用程序,所以这就是我所做的对我有用的东西:

  • make_celery在创建应用实例的同一文件中定义(在您的情况下看起来像server.py
  • 我的任务在单独的tasks.py中定义,该server.pymake_celery位于同一目录中。这也是我实例化我的芹菜对象(来自public void favouriteList(MainActivity av, Ordering o, string favouriteName, string totalCost, JittersListView jlv) { //Checks Directory exists if (File.Exists(Android.OS.Environment.DirectoryDownloads + "/Jitters/FavouritesListAdded.txt") == false) { Directory.CreateDirectory(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/"); File.Create(Android.OS.Environment.DirectoryDownloads + "/Jitters/FavouritesListAdded.txt"); } if (File.Exists(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/" + favouriteName + ".txt") == false) { var fav = File.Create(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/" + favouriteName + ".txt"); fav.Close(); string file = Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/" + favouriteName + ".txt"; string added = null; int current = 0; while (true) { if (current < jlv.Count) { JittersListItem jli = jlv[current]; added += jli.Top + "|" + jli.Bottom + "|" + jli.itemPic + "|" + jli.itemDes + System.Environment.NewLine; current++; } else { break; } } File.AppendAllText(file, favouriteName + "|" + totalCost + added); } else { new AlertDialog.Builder(av) .SetMessage("Please use a different name, this one has been taken.") .Show(); } }
  • 的地方
  • 在旋转芹菜工人时,使用-A开关,然后为其提供tasks.py的路径

我希望这会有所帮助,如果您对我的应用程序的组织方式有任何其他疑问,请与我们联系。