这是我的第一个烧瓶和芹菜项目。我的Flask应用程序具有一个运行时间较长的进程,因此我尝试使用Celery使其异步运行。 基本上,代码需要根据请求生成文件。 完成后,应将用户重定向到可以下载此文件的页面。 作为AMQP,我使用Rabbitmq。 我的项目具有以下结构:
Project/
|-- flasK.py
|-- asynC.py
|--db.sqlite3
|
|-- templates/
| |-- index.html
| |-- done.html
| |-- inProc.html
|
|-- |-- static/
|-- css(empty)
|-- js(empty)
运行烧瓶服务器flasK.py的脚本:
from asy import createSAV_2
from flask import Flask, render_template, url_for, request, redirect, send_file, send_from_directory, safe_join, abort
from celery.result import AsyncResult
flask_app = Flask(__name__)
@flask_app.route('/', methods=['POST', 'GET'])
def index():
if request.method == 'POST':
#createSAV_2.apply_async((2, 2), queue='test')
createSAV_2.delay(2, 2)
return render_template("inProc.html")
else:
pass
return render_template("index.html")
if __name__ == '__main__':
flask_app.run(port=8080, debug=True)
运行Celery,asynC.py的代码:
from celery import Celery
from time import sleep
from celery.result import AsyncResult
from flask import render_template
app = Celery('asy', broker='pyamqp://guest@localhost//', backend='db+sqlite:///db.sqlite3')
@app.task(name='createSAV_2')
def createSAV_2 (a, b):
sleep(5)
return render_template("done.html")
我运行服务器并尝试模拟数据请求后,出现此错误:
[2020-11-01 13:44:41,545: ERROR/ForkPoolWorker-2] Task createSAV_2[93a094c7-2315-4016-8deb-acffae18f0ef] raised unexpected: AttributeError("'NoneType' object has no attribute 'app'")
Traceback (most recent call last):
File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/venv/lib/python3.7/site-packages/celery/app/trace.py", line 409, in trace_task
R = retval = fun(*args, **kwargs)
File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/venv/lib/python3.7/site-packages/celery/app/trace.py", line 701, in __protected_call__
return self.run(*args, **kwargs)
File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/asy.py", line 11, in createSAV_2
return render_template("done.html")
File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/venv/lib/python3.7/site-packages/flask/templating.py", line 136, in render_template
ctx.app.update_template_context(context)
AttributeError: 'NoneType' object has no attribute 'app'
如果我使用.apply_async而不是.delay,则不会收到任何错误或其他消息。
Celery正在运行,如果我试图从docs运行示例代码: https://docs.celeryproject.org/en/stable/getting-started/first-steps-with-celery.html 然后就可以了。
如果您有任何想法/建议,请告诉我
答案 0 :(得分:0)
您不应将Celery用于此用途,Celery用于在另一台服务器或实例上运行异步任务。
要解决您的错误,请不要在asy.py中使用任何Flask导入并继续使用.delay()
,但是在这种情况下,芹菜是无用的,因为您只能调用createSAV_2()
方法。
如果您真的想这样做,因为createSAV_2()
可能需要一段时间,则应该使用apply_async()
生成一个任务,并实现一个循环以等待任务结束。因此,与使用delay()
...
总而言之,我不确定Celery在您的特定情况下是否有用。一开始要保持简单。
(评论已转换为答案)