Ошибка CORS при использовании pyyaml ​​с FastAPI - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать простое веб-приложение, использующее переднюю часть реагирования и заднюю часть fastapi. Одна из функций веб-приложения - отправка файла, который собирается во внешнем интерфейсе и обрабатывается во внутреннем. У меня есть конечная точка на стороне сервера, которая выглядит следующим образом:

@app.post("/upload_file/")
async def create_upload_file(file: UploadFile = File(...)):
    for line in file.file.readlines():
        print(line)
    file.file.close()
    return {"filename": file.filename}

Я подтвердил, что этот код работает. С внешнего интерфейса я могу отправить файл, посмотреть, как распечатываются строки на моем внутреннем терминале, и внешний интерфейс получает HTTP-ответ с кодом состояния 200 и именем файла.

Проблема возникает, когда я пытаюсь использовать библиотеку pyyaml ​​для обработки входящего файла yaml. Ниже приведен фрагмент кода, который не работает:

@app.post("/upload_file/")
async def create_upload_file(file: UploadFile = File(...)):
    yaml_data = yaml.load(file, Loader=yaml.FullLoader)
    return yaml_data

Я получаю сообщение об ошибке:

Access to XMLHttpRequest at 'http://127.0.0.1:8000/upload_file/' (redirected from 'http://127.0.0.1:8000/upload_file') from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Так что, похоже, это проблема CORS ... Моя текущая политика CORS для FastAPI выглядит так:

origins = [
    "http://localhost",
    "http://localhost:3000",
    "http://127.0.0.1:8000",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

Нужно ли что-то добавить в мою политику CORS, чтобы разрешить ей использовать pyyaml? Я не думал, что это будет так, поскольку обработка должна выполняться в той же конечной точке (обратите внимание, что конечные точки находятся в одном и том же месте), однако CORS явно не в восторге от использования этой функции yaml.load(). Будем весьма благодарны за любые предложения по возможности загрузки файлов yaml в мой бэкэнд.

В ответ на запрос Ришабх Батры я добавил здесь заголовки OPTIONS: enter image description here

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Решил это. Оказывается, для starlette, библиотеки, из которой построена FastAPI, объект UploadFile не аналогичен объекту python. Если вы хотите, чтобы он вел себя как файловый объект python, вам нужно сделать file.file. Таким образом, для приведенного выше фрагмента, который не сработал, правильный способ сделать это будет выглядеть так:

@app.post("/upload_file/")
async def create_upload_file(file: UploadFile = File(...)):
    yaml_data = yaml.load(file.file, Loader=yaml.FullLoader)
    return yaml_data

Политика CORS была правильной, понятия не имею, почему она выдает ошибку CORS

0 голосов
/ 25 февраля 2020

внутренний код, запущенный на другом порту, вы можете использовать * или определить весь порт, который используется в вашем приложении

origins = [
    "http://localhost:*",
    "http://localhost:3000",
    "http://127.0.0.1:8000",
]
...