我查看了所有相关问题,但找不到我想要的东西。
我有一个烧瓶应用app.py
,其中还包括芹菜任务
from flask import Flask, request, current_app
from celery import Celery
from mongoalchemy.session import Session
from PIL import Image
from model import the_data
app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
celery = Celery('app', broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
@celery.task
def process_image():
with app.app_context():
session = Session.connect('mydb')
session.clear_collection(the_data)
image = Image.open(request.files['file'])
### do something ###
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
if 'file' in request.files:
process_image.delay()
return 'Processing image...'
if __name__ == '__main__':
app.run(debug=True, port=8008)
简而言之,app.py
将从其他脚本接收通过requests.post
发送的图像文件,并将其传递到队列以便使用芹菜进行处理。
我使用app.app_context()
作为我发现的RuntimeError: Working outside of request context
的解决方案,但不幸的是,即使我编辑了代码,错误仍然存在。
我该怎么做才能解决这类错误?
感谢您的帮助。
答案 0 :(得分:0)
looks like你可以通过将* args和** kwargs作为参数包含在delay
调用中来传递给你的任务。将文件传递给process_image
功能。这不起作用的原因是您在上下文之外访问请求。一旦return 'Processing image...'
执行该上下文关闭。
编辑:基本上,从我链接到的文档中可以看出,您可以在process_image
函数中添加参数并在delay
调用中将其传递给它。这是未经测试的,因此可能需要一些调整。
@celery.task
def process_image(file=None):
if file is None:
return False
image = Image.open(file)
### do something ###
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
if 'file' in request.files:
process_image.delay(request.files['file'])
return 'Processing image...'