Файл FastAPI должен быть загружен перед формой в параметрах функции - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть конечная точка, которая принимает файл и строковый параметр, который я передаю через тело формы. Но я заметил, что при отладке:

import uvicorn
from fastapi import FastAPI, File, Form

app = FastAPI()


@app.post('/test')
def test(test_item: str = Form(...), test_file: bytes = File(...)):
    return {
        "test_item": test_item,
        "test_file_len": len(test_file),
        "test_file_contents": test_file.decode('utf-8')
    }


if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)

с помощью этой простой команды curl с test_file.txt, имеющим текст:

curl localhost:8000/test -X POST -F test_file=@"test_file.txt" -F test_item="test"

не работал с этой ошибкой:

{
    "detail": [
        {
            "loc": [
                "body",
                "test_file"
            ],
            "msg": "byte type expected",
            "type": "type_error.bytes"
        }
    ]
}

но, что интересно, это сработало:

import uvicorn
from fastapi import FastAPI, File, Form

app = FastAPI()


@app.post('/test')
def test(test_file: bytes = File(...), test_item: str = Form(...)):
    return {
        "test_item": test_item,
        "test_file_len": len(test_file),
        "test_file_contents": test_file.decode('utf-8')
    }


if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)

с той лишь разницей, что вы получаете файл перед элементом Form. Кто-нибудь знает, почему это произойдет? Похоже, что необходимо выгрузить файлы перед формой. Возможно, файл уничтожается, когда Form анализирует тело формы http. Я не видел ничего в документации FastAPI об этом для формы и файлов.

...