Как настроить более гибкую систему CORS в FastAPI / Starlette?

Как я могу правильно реализовать проверку CORS в FastAPI для запросов, где разрешенные origin зависят от параметра tenant? Существует ли пакет, который может помочь с этим? Или можете ли вы рекомендовать проекты на базе FastAPI/Starlette, где реализована подобная функциональность? Я просмотрел документацию CORSMiddleware, но не нашел ответа на свои вопросы. Я также просмотрел репозитории на GitHub с тегом "fastapi cors".
  • 15 ноября 2023 г. 13:49
Ответы на вопрос 1
FastAPI основан на Starlette, поэтому вы можете использовать любую настройку CORS, которую обычно используете с Starlette. 

Для удобной работы с CORS в FastAPI можно использовать пакет `fastapi-cors`. Он предоставляет дополнительные функции и параметры для настройки CORS в FastAPI.

Вот пример, как добавить проверку CORS в FastAPI с использованием `fastapi-cors`:

Установите пакет `fastapi-cors`:
```bash
pip install fastapi-cors
```

Импортируйте `FastAPI` и `CORSMiddleware` из `fastapi` и `fastapi_cors` соответственно:
```python
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
```

Создайте экземпляр FastAPI:
```python
app = FastAPI()
```

Настройте CORS Middleware:
```python
origins = [
    "http://example1.com",
    "http://example2.com",
    "http://example3.com",
]

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

В приведенном выше примере, `allow_origins` указывает список разрешенных origin, `allow_credentials` позволяет передавать куки и заголовки аутентификации, `allow_methods` указывает разрешенные HTTP-методы, а `allow_headers` указывает разрешенные заголовки.

Вы также можете указать условные ограничения CORS с использованием лямбда-функций или других подходов в зависимости от параметра `tenant`. В этом случае, вам может потребоваться прочитать документацию Starlette по настройке CORS, так как FastAPI полагается на его функционал.

Некоторые проекты на базе FastAPI/Starlette, где можно изучить реализацию CORS, включают в себя:
- `cookiecutter-fastapi`: https://github.com/tiangolo/full-stack-fastapi-postgresql
- `FastAPI-RealWorld-Example-App`: https://github.com/nsidnev/fastapi-realworld-example-app
- `fastapi-pyjwt`: https://github.com/lmas/fastapi-pyjwt

Установите и изучите их для получения дополнительной информации о реализации CORS в FastAPI.
Похожие вопросы