인프런 커뮤니티 질문&답변

sh007.jeong님의 프로필 이미지

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

유저/IP 별 API 최대 호출 횟수 제한하기 (Throttling)

Throttle 설정이 적용되지 않아요

작성

·

313

0

안녕하세요! 강의 잘 듣고 있습니다.

 

DRF 최대 호출 횟수 제한 강의를 보고 적용해보기 위해서 

다음과 같이 settings.py를 수정하였는데 리퀘스트 제한이 걸리지 않습니다. 서버를 리스타트해봐도 해결이 안되는데 뭐가 문제일까요?

 

settings.py 소스코드 일부


REST_FRAMEWORK = {
'PAGE_SIZE': 20,
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.UserRateThrottle',
# 'rest_framework.throttling.AnonRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'user': '3/day',
# 'anon': '3/day',
},
}

 

httpie Response 메시지

 

 

답변 4

1

이진석님의 프로필 이미지
이진석
지식공유자

본 이슈가 잘 풀려가고 계신가요? :-)

장고 버전 3.2 라서 문제가 발생하지는 않을 듯 하구요. 뭔가 다른 부분이 있지 않을까 싶습니다.

아래와 같이 장고 3.2.x 에서 프로젝트를 생성하여, 위에서 보여드린 코드대로 아래와 같이 테스트해보았습니다.

정확히 4번째 요청에서 429 응답이 오고 있습니다.

잘 하고 계십니다. 화이팅입니다. :-)

0

sh007.jeong님의 프로필 이미지
sh007.jeong
질문자

버전을 바꿔서 시도해보니 그것도 아니라는 것을 확인하였고 결국 settings.py에 rest_framework.throttling 모듈이 임포트 되어 있었던 것이 문제였던 것으로 확인하였습니다. 

파이참 환경인데 따옴표 없이 광역 설정을 타이핑하다가 실수로 임포트해버린 것 같습니다... ^^;

도와주셔서 감사합니다!

0

sh007.jeong님의 프로필 이미지
sh007.jeong
질문자

이번에도 빠른 답변 주셔서 대단히 감사드립니다.

조언을 참고하여 문제를 곰곰히 생각해보니 Django(3.2.x 사용) 버전 차이로 인한 문제가 아닐까 생각했습니다.

DRF의 SimpleRateThrottle 클래스가 Django의 cache 인스턴스(`default_cache`)를 멤버 변수로 사용한다고 하셔서 혹시 몰라 3.0.x 버전과 3.2.x 버전의 소스 코드를 비교해보았는데 3.2.x 부터 `cache` 인스턴스를 구성하는 클래스가 대폭 바뀐 점이 보였습니다. 

(default cache obj를 프록시하는 클래스(DefaultCacheProxy)에서 ConnectionProxy의 인스턴스로 바뀜)

아마 이 부분에서 문제가 생긴 것으로 생각됩니다.

강의에서 사용하신 버전과 동일한 버전으로 Example 프로젝트를 생성하여 실행해보니 저도 잘 동작하는 것을 확인하였습니다. 

Throttle rate 문제는 아직 해결 못 했지만 실마리를 찾았으니 곧 해결할 것 같습니다. 

마이너 버전의 차이도 이런 차이가 난다는 것을 실감했네요...

 

덕분에 정말 많은 공부가 되고 있습니다.

감사합니다.

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

보여주신 내역으로 저도 아래와 같이 샘플 프로젝트를 만들어서 테스트를 해보았습니다. 뷰는 APIView를 상속받았으며, 디폴트 설정을 따르도록 했구요. settings 내에 디폴트 퍼미션 및 throttle classes/rates를 지정했습니다.

클라이언트 요청은 cli에서 하셔도 되고 웹브라우저 상에서 해보실 수도 있습니다. 웹브라우저로 접속해서 먼저 로그인 후에 API 요청을 해보면, 현재 rates가 3/day 이기에 정확히 4회 요청에서 아래와 같이 429 Too Many Requests 응답을 받고 있음을 확인했습니다.

혹시 다른 경로의 프로젝트를 구동 중인 건 아니신지, 모든 코드를 잘 저장하셨는 지 확인 부탁드리구요. 소스코드 편집기의 save all 메뉴를 활용하시면 좋습니다. 그리고 DRF 룰 적용을 위해 모든 뷰는 APIView를 상속받은 CBV이거나 (뷰셋도 포함), @api_view() 장식자가 적용된 FBV여야 합니다.

화이팅입니다. :-)