작성
·
316
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
버전을 바꿔서 시도해보니 그것도 아니라는 것을 확인하였고 결국 settings.py에 rest_framework.throttling 모듈이 임포트 되어 있었던 것이 문제였던 것으로 확인하였습니다.
파이참 환경인데 따옴표 없이 광역 설정을 타이핑하다가 실수로 임포트해버린 것 같습니다... ^^;
도와주셔서 감사합니다!
0
이번에도 빠른 답변 주셔서 대단히 감사드립니다.
조언을 참고하여 문제를 곰곰히 생각해보니 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여야 합니다.
화이팅입니다. :-)