我有一个调用任务的烧瓶应用程序。该任务从数据库中提取数据,绘制折线图并返回在 html 页面上呈现的 html 内容。如果没有 Celery,Flask 应用程序可以正常工作并在客户端呈现折线图,但现在我想委托 celery 通过以下方式运行任务RabbitMQ
Broker,它运行时我可以在 Celery shell 中看到日志输出,但生成的 html 内容永远不会发送回 Flask 服务器应用程序。怎么做?
这是后续http://stackoverflow.com/questions/37839551/how-to-restart-flask-process-by-refreshing-page/38146003#38146003 http://stackoverflow.com/questions/37839551/how-to-restart-flask-process-by-refreshing-page/38146003#38146003.
#server-celery.py
app = Flask(__name__)
@app.route('/',methods=['GET'])
def index():
return render_template("index.html")
@app.route('/', methods=['GET', 'POST'])
def plotdata():
form = InputForm(request.form)
if request.method == 'POST' and form.validate():
lineChart = task.main.delay(form.startdate.data, form.enddate.data)
return render_template('view.html', form=form, result= lineChart)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
并且任务运行为Celery
worker:
#task.py
from celery import Celery
broker = 'amqp://localhost:5672'
app = Celery(__name__, broker=broker)
def queryDatabase(param1, param2):
#query database, return results
return data
def plotLineChart(data):
#plot data as line Chart
return LineChartHtmlcontent
@app.task
def main(param1,param2):
data = queryDatabase(param1,param2)
return plotLineChart(data)
和客户端 html 页面:
<!--view.html-->
<form method=post action="">
<table>
{% for field in form %}
<tr>
<td>{{ field.label }}</td>
<td>{{ field }}</td>
</tr>
{% endfor %}
</table>
<p><input type=submit value=Submit></form></p>
<p>
{% if result != None %}
<img src="{{ result }}" width="500">
{% endif %}
</p>