Загрузка больших файлов с помощью Flask и Celery

Я пытаюсь реализовать загрузку большого файла в 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(), передается неправильно. Я не могу понять, почему это происходит, и я достиг контрольно-пропускного пункта с моими исследованиями.

Я действительно хотел бы получить некоторое представление об этом.


person VimalSheoran    schedule 20.03.2019    source источник
comment
Разве нельзя просто передать request (или его компоненты) в качестве аргументов при вызове save_operation.delay()? Вместо того, чтобы полагаться на контекст Flask.   -  person Tomáš Linhart    schedule 20.03.2019
comment
@TomášLinhart, дело в том, что .delay() принимает только значения json, и я могу сериализовать объект request, используя jsonpickle, но когда я пытаюсь его десериализовать, он выдает ошибку времени выполнения.   -  person VimalSheoran    schedule 21.03.2019