Я пытаюсь реализовать загрузку большого файла в flask
, используя celery
. У меня есть функция, которая сохраняет файловый поток на диск как задача celery, но моя реализация требует использования контекста request
внутри моей функции задачи. Я провел свое исследование и реализовал решения, представленные по ссылкам, указанным в этом ответе, но, похоже, это не работает с моей версией celery, которая 4.1.0
Вот что я делаю
Это моя задача
@task(name="app.save_operation")
def save_operation():
content = request.files["content"]
content.save(
content.filename)
content.stream.close()
return
Это оболочка @task
def task(**kwargs):
def decorator(func):
@celery_helper.task(**kwargs)
@functools.wraps(func)
def wrapped(*args, **kwargs):
with app.test_request_context():
return func(*args, **kwargs)
return wrapped
return decorator
И это функция обработчика API, где я вызываю эту задачу
@app.route("/upload", methods=["GET", "POST"])
def upload():
if (request.method == "POST"):
filename = request.files["content"].filename
task_id = save_operation.delay()
return "upload started for "+filename
`` Теоретически это должно работать нормально, но когда я это делаю, celery выдает BadRequestKeyError
, что по существу означает, что объект request
, на который ссылается задача save_operation()
, передается неправильно. Я не могу понять, почему это происходит, и я достиг контрольно-пропускного пункта с моими исследованиями.
Я действительно хотел бы получить некоторое представление об этом.
request
(или его компоненты) в качестве аргументов при вызовеsave_operation.delay()
? Вместо того, чтобы полагаться на контекст Flask. - person Tomáš Linhart   schedule 20.03.2019.delay()
принимает только значенияjson
, и я могу сериализовать объектrequest
, используяjsonpickle
, но когда я пытаюсь его десериализовать, он выдает ошибку времени выполнения. - person VimalSheoran   schedule 21.03.2019