FastAPI — CORS и slowapi

#python #cors #fastapi

Вопрос:

В настоящее время я развертываю веб-приложение с бэкэндом, используя fastapi/heroku и интерфейс react/netlify. Первоначально у меня была проблема CORS (заголовок CORS ‘Access-Control-Allow-Origin’), которая была решена с помощью CORSMiddleware.

В решил изучить ограничение скорости для моего приложения и в результате исследований обнаружил, что slowapi является наиболее рекомендуемым. Проблема, однако, возникает при реализации slowapi через их документацию (https://slowapi.readthedocs.io/en/latest/), я снова возвращаюсь к получению ошибок CORS.

Кто-нибудь еще сталкивался с подобной проблемой и имел обходной путь? Или есть лучший способ в целом ограничить скорость моего приложения.

Пример кода:

 from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded

limiter = Limiter(key_func=get_remote_address)
origins = [example_origin]

app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=origins)
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

@app.get("/home")
@limiter.limit("5/minute")
def homepage(request: Request):
    return {"test": "words"}
 

Комментарии:

1. Каковы точные сообщения об ошибках, которые браузер регистрирует в консоли devtools?

2. Каков код состояния HTTP ответа? Вы можете проверить это с помощью панели «Сеть» в настройках браузера. Если Chrome не показывает его вам, используйте панель «Сеть» в Firefox devtools, чтобы проверить его. Является ли это ошибкой 4xx или 5xx, а не ответом на 200 ОК?

3. @sideshowbarker Точное сообщение об ошибке в консоли: «Запрос перекрестного происхождения заблокирован: Та же политика происхождения запрещает чтение удаленного ресурса по <<url-адресу веб-сайта><url-адрес веб-сайта>>. (Причина: отсутствует заголовок CORS ‘Access-Control-Allow-Origin’).»

Ответ №1:

Обновление: Проблема была решена путем включения импорта «Запроса», чего-то, что не указано в документах slowapi, и запроса: Запрос в конечной точке (который включен в документы)

 from fastapi import FastAPI, Request

@app.get("/home")
def homepage(request: Request):
    return {"test": "words"}