스택큐힙리스트

FastAPI와 SlowAPI는 모든 "path/*" 아래의 요청을 제한합니다. 본문

카테고리 없음

FastAPI와 SlowAPI는 모든 "path/*" 아래의 요청을 제한합니다.

스택큐힙리스트 2024. 1. 26. 15:44
반응형

from fastapi import FastAPI, Request, Response, status
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
from slowapi.middleware import SlowAPIMiddleware
limiter = Limiter(key_func=get_remote_address, default_limits=[2/5seconds])
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
origins = [http://127.0.0.1/, http://localhost, http://192.168.1.75] ## CORS
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=[*],
allow_headers=[*],
)
app.add_middleware(SlowAPIMiddleware) ## Rate-limit all request
@app.get('/schools/{regione}/{provincia}/{comune}')
def search_school(request: Request, response: Response, regione: str, provincia: str, comune: str):
return {message: '학교를 찾을 수 없습니다!', status: '에러', code: 200} ## 또는 찾은 학교 정보 반환
@app.get('/testpath/{regione}') ## 하나의 경로와 작동합니다. provincia와 comune을 추가하면 작동하지 않습니다.
def search_school(request: Request, response: Response, regione: str, provincia: str, comune: str):
return {message: '학교를 찾을 수 없습니다!', status: '에러', code: 200} ## 또는 찾은 학교 정보 반환

jQuery를 사용하여 /schools/{지역}/{도}/{도시}로 요청을 보내면 전체 URL이 제한되어 있으므로, 지역이나 도를 변경하면 제한이 재설정됩니다. 어떻게 하면 /schools/*에 대한 설정을 적용할 수 있을까요?


예시:


5초마다 2번의 요청


apiURL+/schools/Lombardy/Milan/Milan로 요청을 보내면 제한이 1씩 증가하며, 3번째 요청에서 차단됩니다.


하지만 동일한 도메인 대신에 도시를 변경하면 (apiURL+/schools/Sicily/Palermo/Palermo), 제한이 재설정되고 1로 돌아갑니다.

답변 1

옵션 1


Limiter 클래스를 인스턴스화할 때 application_limits를 정의하십시오. 문서에 나와 있는 대로,



application_limits:
전체 응용 프로그램에 적용되는 제한에 대한 문자열 또는 문자열을 반환하는 호출 가능한 목록



따라서 아래 예제는 모든 /schools/* 경로뿐만 아니라 응용 프로그램에서 사용 가능한 다른 경로(/testpath/*, /some-other-route/ 등)에 대해서도 공유 제한을 적용하므로, 각 클라이언트당 5초당 2개의 요청만 통과됩니다 (호출되는 엔드포인트에 관계없이).


limiter = Limiter(key_func=get_remote_address, application_limits=[2/5seconds])

shared_limit을 사용하여 원하는 엔드포인트에만 공유 제한을 적용할 수 있습니다. 문서에 따르면:



shared_limit: 동일한 속도 제한을 공유하는 여러 라우트에 적용되는 데코레이터입니다.



따라서 아래의 코드는 /schools/* 라우트에만 공유 제한을 적용합니다.


limiter = Limiter(key_func=get_remote_address, default_limits=[2/5seconds])
@app.get('/schools/{regione}/{provincia}/{comune}')
@limiter.shared_limit(limit_value=2/5seconds, scope=schools)
def search_school(request: Request, response: Response, regione: str, provincia: str, comune: str):
return {message: '학교를 찾을 수 없습니다!', status: '에러', code: 200}

답변 2

프로그래밍 세계에서 API는 매우 중요한 요소로서 빠른 데이터 교환을 가능하게 해줍니다. 개발자들은 고성능의 API를 설계하고 구현하는 데 많은 노력을 기울이고 있습니다. 그 중 FastAPI와 SlowAPI는 새로운 API 프레임워크로서 주목 받고 있습니다.
FastAPI는 매우 빠른 속도로 비동기적으로 동작하는 웹 API를 구축할 수 있는 파이썬 기반의 프레임워크입니다. 이를 통해 개발자들은 빠르게 응답하고 처리 속도에 큰 장점을 제공할 수 있습니다.
한편, SlowAPI는 그 이름에서 알 수 있듯이 느린 속도로 요청을 처리하는 API입니다. 이러한 API는 주로 테스트 목적이나 더 많은 리소스를 요구하는 작업을 처리하기 위해 사용됩니다.
두 API가 경로(path/*) 내에서 요청을 제한하는 기능을 가지고 있다면, 이는 개발자들에게 큰 이점을 제공합니다. 요청을 제한함으로써 서버에 가해지는 부하를 줄일 수 있으며, 효율적인 리소스 사용을 위해 필수적인 조치입니다.
이러한 요청 제한은 검색 엔진 최적화(SEO)에도 긍정적인 영향을 미칩니다. 검색 엔진은 웹 페이지의 속도를 고려하여 높은 순위를 부여하는 경향이 있습니다. 따라서 API의 속도가 빠르고 요청이 효율적으로 처리된다면 검색 엔진에서의 페이지 순위도 높아질 수 있습니다.
또한, 요청을 제한함으로써 API의 보안도 향상됩니다. 과다한 요청이나 악성 사용자에 의한 공격을 방지하는 데 도움이 되며, 서버의 안정성을 유지할 수 있습니다. 이는 사용자들에게 안전하고 신뢰할 수 있는 환경을 제공하는 데 큰 역할을 합니다.
최근에는 웹 페이지의 속도와 성능은 매우 중요한 요소로 인식되고 있습니다. 사용자들은 빠른 응답, 원활한 데이터 접근이 가능한 웹 사이트를 선호합니다. 이를 고려하여 개발자들은 FastAPI와 SlowAPI를 사용하여 속도와 효율성을 극대화할 수 있습니다.
이러한 제한된 요청 기능은 개발자들에게 SEO 측면에서도 이점을 제공합니다. 웹 페이지의 속도와 안정성은 검색 엔진에서의 페이지 순위와 통계를 좌우하기 때문에, 요청을 효율적으로 제한하고 성능을 향상시킴으로써 더 나은 검색 엔진 최적화 결과를 얻을 수 있습니다.
FastAPI와 SlowAPI는 개발자들에게 최고의 성능과 안정성을 제공하는 뛰어난 API 프레임워크입니다. 요청을 제한하는 기능을 사용하면 서버의 부하를 줄이고 보안을 강화할 수 있으며, 이러한 조치는 검색 엔진 최적화에도 긍정적인 영향을 미칩니다. 이렇게 개발자들은 API를 효율적으로 활용하여 사용자들에게 원활한 경험을 제공할 수 있습니다.

반응형
Comments