2010-03-04 7 views
0

Existe-t-il un moyen simple de limiter le nombre d'accès à une vue par adresse IP donnée par jour/semaine? Une version simplifiée de la technique utilisée par certains libraires pour limiter le nombre de pages d'un livre que vous pouvez prévisualiser?Limiter le nombre de vues par jour dans Django

Il n'y a qu'une vue à laquelle cette limite doit s'appliquer - c'est-à-dire. ce n'est pas une limite générale - et ce serait bien si je pouvais simplement avoir une variable overlimit dans le contexte du modèle. La solution n'a pas besoin d'être très robuste, mais la limitation par adresse IP semble être une meilleure idée que d'utiliser un cookie.

J'ai regardé dans le session middleware mais il ne fait aucune référence au suivi des adresses IP autant que je peux dire.

Est-ce que quelqu'un a rencontré ce problème?

Répondre

3

La solution je suis venu avec harnaché l'application django-hitcount et un "emballage" de la vue originale. Heureusement, j'ai un objet (Page) que je peux associer à la vue que j'essaie de limiter, donc l'application hitcount fonctionne bien (et surtout comme prévu).

La vue que je suis suivi est line_list - donc j'ai appelé la nouvelle vue pour l'envelopper line_list_monitor et associé l'URL d'origine pour line_list avec elle. La nouvelle vue est incluse ci-dessous. Si l'adresse IP en question est au-dessus de la limite (20 vues par semaine), je redirige vers overlimit.html, sinon la vue originale est appelée comme normale.

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

L'objet HttpRequest a un dictionnaire membre META, qui a un membre REMOTE_ADDR, donc request.META["REMOTE_ADDR"] vous devriez obtenir l'adresse IP dans la vue, qui peut ensuite définir overlimit dans le contexte ... Est-ce que vous voulez?

+0

Mais je dois garder un compte courant. En ce moment, je pense que cela nécessite un nouveau modèle pour suivre les demandes de vue par IP ... pensé que je pourrais éviter cela cependant. – ariddell

+0

Je viens de répondre à la question posée. Toute solution aura besoin d'un modèle par IP ou par utilisateur à créer pour suivre l'utilisateur. Le type de système dont vous parlez n'est pas très robuste et peut être relativement facile à contourner via des proxies ou des affectations IP dynamiques. Les sessions ont vraiment pour but d'empêcher l'utilisateur de présenter un identifiant d'utilisateur et un mot de passe pour chaque action individuelle, c'est-à-dire une commodité pour l'utilisateur et l'opérateur du site. Si vous essayez de l'utiliser pour restreindre l'utilisateur, ils trouveront un moyen de contourner le problème. En outre, si le chargement de la page échoue, il peut tromper l'utilisateur. –

0

Si vous êtes en mesure de définir le pare-feu (iptables/netfilter) sur votre serveur, vous pouvez limiter l'accès très facile. un tutoriel comment cela est fait peut être trouvé au debian administrator. C'est un exemple de comment sécuriser le port ssh, mais vous pouvez utiliser la même technique pour http.

J'ai tous mes serveurs "sécurisés" comme celui-ci, et je suis très chanceux avec cela.

garder à l'esprit que si vous avez ajax fonctionnalité sur votre site vous avez besoin beaucoup plus de demandes/minute comme sur les sites non ajax autorisés par le pare-feu

+0

Ainsi, le pare-feu peut limiter le nombre d'accès à une certaine plage de pages Web à un certain nombre par jour et par IP, tout en permettant un accès illimité au reste du site? Cela ressemble à une inspection approfondie des paquets. –

Questions connexes