#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"}