我使用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
的文件,那么该文件必须导入app
和make_celery
并在应用程序中必须导入convert_task.py
我试过了,我得到了
无法导入名称'app'
组织这个的pythonic方法是什么。这背后的原因我们将向server.py
添加更多任务,我不希望它成为神文件。
答案 0 :(得分:0)
您可能会获得circular import。
您可以通过执行以下操作之一来解决此问题:
将失败的导入移动到文件底部。
将导入移动到使用导入的功能(不在模块的顶层)。
重新组织模块,以便convert_task
和server
从第三个模块导入,而第三个模块不会从这两个文件中导入。
如果您仍然遇到问题,请发布文件的确切布局以及导入内容的内容。使用几行代码(不包括烧瓶/芹菜特定的东西)重现问题应该很容易。
答案 1 :(得分:0)
我一直在开发一个使用Celery的烧瓶应用程序,所以这就是我所做的对我有用的东西:
make_celery
在创建应用实例的同一文件中定义(在您的情况下看起来像server.py
)tasks.py
中定义,该server.py
与make_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();
}
}
)我希望这会有所帮助,如果您对我的应用程序的组织方式有任何其他疑问,请与我们联系。