Django API 액세스 제한 빈도 일반 방법 해석

2492 단어 DjangoAPI방문
요구 사항:
플랫폼에서 제3자가 호출할 수 있도록 인터페이스를 작성해야 하고 호출 주파수를 제어해야 하며 5s에서 한 번 호출한 후에 다시 호출할 수 없다.
사고방식을 해결하다
1. Django 공식 플러그인 라이브러리에 django-ratelimit 플러그인이 있어 요구를 충족시킬 수 있습니다. django-ratelimit 문서 주소가 유연하고 강력합니다.우리views 함수에
@ratelimit(key='ip', rate='1/30s', block=True)
장식기만 있으면 돼요. 사이트에 자료가 많지 않아요. 대부분 영어예요.여기서 매개변수를 살짝 설명합니다.
키='ip', 필수 항목, 표지는 IP에 따라 구분된다. 나는 같은 IP를 이해하고 뒤에 파라미터가 설정한 규칙을 따른다.
rate='1/30s', 필수 항목, 설정된 주파수 값, 이 뜻은 30초 안에 한 번 실행하거나'분','시','일'등에 따라 구분할 수 있으며 유연한 설정입니다. 예를 들어 분당 5회 실행하면rate='5/m'라고 쓸 수 있습니다. 여기 참고 문서는 충분히 설명할 수 있습니다.
block=True, 여기서 손해를 보았습니다. 기본값은 False입니다. 게다가 장식기가 이 파라미터를 쓰지 않았습니다. 접근은 제한을 받지 않고 간격 시간 내에 다시 접근할 수 없는 기대 효과에 도달하지 못했습니다. 과감하게 문서를 뒤져보십시오.
구글 번역: False가 주석이 아닌 요청을 막았는지 여부.
대략적인 뜻은 방문이 들어왔을 때 막았는지 블록트루를 한 후에 테스트 방문에서 403을 볼 수 있는데 확실히 막았다는 것이다.
또 다른 매개 변수가 있습니다. 더 많은 수요가 있으면 보십시오. 이것은 그 하나입니다.
2. 세션을 통해 접근 시간을 저장한다
여기에는 사실 두 가지 방식이 있다. 첫째는 중간부품에 쓰는 것이고, 둘째는 장식기이다. 사람마다 수요가 다르다. 나의 이 함수 몇 개는 외부에 호출해야 하는 것이다. 아예 장식기를 만들고 코드를 붙인다.

def limit(seconds = 5):
'''
@func:  
'''
def rate_limit(func):
def func_limit(request):
now=time.time()
request_time = request.session.get('request_time',0)
interval_time = int(now - request_time)
if interval_time < seconds:
ret = ret_content(20008,'%s  '%(seconds-interval_time))
return JsonResponse(ret)
else:
request.session['request_time'] = time.time()
ret = func(request)
return ret
return func_limit
return rate_limit
def ret_content(ret_code,message):
return {'ret_code':ret_code,'message':message}
대략적인 사고방식은 현재 방문한 시간을session에 저장하고 시간 간격을 설정합니다. 시간 간격 안에 있을 때 새로 고치지 못하게 하고 json으로 돌아가서 시간 간격을 초과하여session을 업데이트하고 실행하도록 합니다.다음을 사용합니다.
@limit(seconds=30)
30s내에 한 번 실행하면 이 거지판의 첫 번째 방법은 유연하지 않지만 금지 기간에 돌아오는 결과치는 비교적 우호적이지 403이 아니다.프로그램 처리가 비교적 편리할 것입니다. 또한 IP의 상황에 맞추어 저는 처리하지 않았습니다. 필요하면 스스로 고칠 수 있습니다.request_time을 IP + Salt 방식으로 바꾸면 됩니다.
외부 IP 주소 획득 코드도 여기에 붙어 있습니다.

def get_remote_cli_ip(request):
'''
@func: ip
'''
ip = request.META.get('HTTP_X_FORWARDED_FOR',0)
if ip == 0:
return request.META['REMOTE_ADDR']
else:
return ip
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기