Я пытаюсь создать простое веб-приложение, использующее переднюю часть реагирования и заднюю часть 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: