inflearn logo
강의

講義

知識共有

React を使用した Python/Django Web サービス開発完全ガイド

ユーザー/IP 固有 API の最大呼び出し回数を制限する (Throttling)

Throttle 설정이 적용되지 않아요

444

sh

投稿した質問数 5

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 메시지

 

 

throttle react throttling django drf docker python

回答 4

1

pyhub

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

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

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

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

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

0

sh

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

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

도와주셔서 감사합니다!

0

sh

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

조언을 참고하여 문제를 곰곰히 생각해보니 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

pyhub

안녕하세요.

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

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

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

화이팅입니다. :-)

안녕하세요.

0

48

1

[OneToOne Field Demo] get_user_model() 메서드를 활용해야 하는 이유?

0

272

1

useEffect 훅에서 else 유무에 따른 결과

0

211

1

useAxios 훅의 dependency array 설정

0

245

1

useEffect에서 변수 업데이트 관련 질문

0

381

1

rest_framework.generics.CreateAPIView의 model 속성 유무

0

266

1

bootstrap4

0

470

4

리뉴얼 강의가 오픈이 되면 기존 강의는 더이상 못보는걸까요

1

362

1

admin form에서 앞선 필드 선택 후 다른 필드 select widget 구성하는 방법

0

572

3

useState는 필수일까요?

0

261

1

python manage.py makemigrations instagram 시 created_at default 오류가 발생합니다.

0

595

4

Django allauth를 사용한 소셜 로그인 시 에러

0

654

1

프로젝트명 변경 뒤, 디버그툴바+디버그모드 사용 시 에러

0

552

2

useLocalStorage() 함수 사용여부

0

228

1

django에 LOGIN_URL = '/accounts/login/'의 의미?

0

447

1

리듀서의 의미 재확인

0

430

1

simple-jwt Refresh Token 사용 노하우

0

897

2

docker compose 를 통한 배포 관련 오류 문의

0

670

1

파이썬 속도 장고 관련 궁금한게 있습니다.

0

364

1

is_like_user

0

233

1

related_name 오류

0

272

1

re_path 오류

0

258

1

re_path url

0

249

1

No post matches the given query

0

659

2