2010-03-04 3 views
0

일별/주별 지정된 IP 주소로보기에 액세스 할 수있는 횟수를 제한하는 쉬운 방법이 있습니까? 일부 서점에서 미리 볼 수있는 책의 페이지 수를 제한하는 데 사용되는 단순화 된 버전의 기술?Django에서 일일 조회 수 제한

이 제한이 적용되어야하는보기는 하나뿐입니다. 일반적인 한계가 아니며, 템플릿 컨텍스트에 변수 overlimit이 있으면 좋을 것입니다. 해결책은 튼튼 할 필요는 없지만 IP 주소로 제한하는 것은 쿠키를 사용하는 것보다 더 좋은 생각이었습니다.

나는 session middleware을 살펴 봤지만 내가 알 수있는 한 추적 IP 주소를 언급하지는 않습니다.

누구에게이 문제가 발생 했습니까?

답변

3

솔루션에 의해 허용 된 비 아약스 사이트에 같은

이 사이트에 아약스 - 기능이있는 경우 훨씬 더 많은 요청이 필요하다는 것을 염두에 두어야/분 내가 마구 django-hitcount 응용 프로그램과 함께 와서 원래보기의 "래핑". 다행히도 필자는 제한하려고하는 뷰와 연결할 수있는 객체 ( Page)를 가지고 있으므로 hitcount 응용 프로그램이 잘 작동합니다 (주로 의도 한대로).

내가 추적하고있는 뷰는 line_list입니다. 새 뷰를 호출하여 line_list_monitor을 랩하고 line_list의 원래 URL을 연결했습니다. 새보기가 아래에 포함되어 있습니다. 문제의 IP가 한도 (한 주에 20 번 조회수)를 초과하면 overimit.html로 리디렉션됩니다. 그렇지 않으면 원래보기가 정상적으로 호출됩니다.

def line_list_monitor(request, character, pagenum): 
    LIMIT_HITS = 20 
    LIMIT_PERIOD = {'weeks': 1} 
    obj, created = Page.objects.get_or_create(character=character, page=pagenum) 
    obj_pk = obj.pk 
    ctype = ContentType.objects.get_for_model(obj) 
    hitcount, created = HitCount.objects.get_or_create(content_type=ctype, 
                  object_pk=obj_pk) 
    hit = Hit(session="", 
       hitcount=hitcount, 
       ip=get_ip(request), 
       user_agent="") 
    hit.save() 
    period = datetime.datetime.utcnow() - datetime.timedelta(**LIMIT_PERIOD) 
    count = hitcount.hit_set.filter(ip=get_ip(request), 
            created__gte=period).count() 
    if count > LIMIT_HITS: 
     template = "overlimit.html" 
     return render_to_response(template, context_instance=RequestContext(request)) 
    else: 
     return line_list(request, character, page) 
0

HttpRequest 객체가 REMOTE_ADDR 멤버가있는 META 멤버 사전을 가지고, 그래서 request.META["REMOTE_ADDR"] 당신에게 다음 상황에 맞는 ...에 overlimit을 설정할 수 있습니다보기의 IP 주소를 당신이 원하는 것을인가를 얻어야한다?

+0

하지만 계속 실행해야합니다. 지금 나는 이것이 IP에 의한 뷰 요청을 추적하는 새로운 모델을 필요로한다고 생각하고있다. 나는 이것을 피할 수 있다고 생각했다. – ariddell

+0

그냥 질문에 대한 답변을했습니다. 모든 솔루션은 사용자를 추적하기 위해 IP 또는 사용자 별 모델을 만들어야합니다. 당신이 말하는 시스템의 종류는 대단히 강력하지 않으며, 프록시 나 유동 IP 할당을 통해 우회하기가 상대적으로 쉽습니다. 세션은 실제로 사용자가 취하는 모든 단일 작업 (예 : 사용자 및 사이트 운영자 모두에게 편리함)에 대해 사용자 ID 및 비밀번호를 표시 할 필요를 방지하기위한 것입니다. 사용자를 제한하기 위해 사용하려고하면 주위를 둘러 볼 수 있습니다. 또한 페이지로드가 실패하면 사용자를 속일 수 있습니다. –

0

서버에서 방화벽 (iptables/netfilter)을 정의 할 수 있다면 액세스를 매우 쉽게 제한 할 수 있습니다. 이것이 어떻게 수행되는지 튜토리얼은 debian administrator에서 찾을 수 있습니다. 이것은 ssh-port를 보호하는 방법의 예이지만 http에 대해 동일한 기술을 사용할 수 있습니다.

저는이 모든 "보안 된"서버를 가지고 있으며, 매우 운이 좋습니다. 방화벽

+0

그래서 방화벽은 특정 웹 페이지 범위에 대한 액세스 수를 IP 당 일일 특정 수로 제한하면서 나머지 사이트는 무제한으로 액세스 할 수 있도록 허용 할 수 있습니까? 깊은 패킷 검사와 같은 소리입니다. –