Ограничить количество просмотров в день в Джанго - PullRequest
0 голосов
/ 04 марта 2010

Существует ли простой способ ограничить количество обращений к просмотру с данного IP-адреса в день / неделю? Упрощенная версия техники, используемой некоторыми книготорговцами для ограничения количества страниц книги, которую вы можете просмотреть?

Существует только одно мнение, к которому должен применяться этот предел - т.е. это не общий предел - и было бы неплохо, если бы у меня была просто переменная overlimit в контексте шаблона. Решение не обязательно должно быть очень надежным, но ограничение по IP-адресу представляется более подходящей идеей, чем использование файла cookie.

Я посмотрел на промежуточное программное обеспечение сеанса , но, насколько я могу судить, в нем нет ссылок на отслеживание IP-адресов.

Кто-нибудь сталкивался с этой проблемой?

Ответы [ 3 ]

3 голосов
/ 21 марта 2010

Решение, которое я придумал, использовало приложение django-hitcount и «обертку» исходного вида. К счастью, у меня есть объект (Page), который я могу связать с представлением, которое пытаюсь ограничить, поэтому приложение hitcount работает хорошо (и в основном так, как и предполагалось).

Прослеживаемое представление - line_list - поэтому я вызвал новое представление, чтобы обернуть его line_list_monitor и связал с ним исходный URL для line_list. Новый вид включен ниже. Если рассматриваемый IP-адрес превышает лимит (20 просмотров в неделю), я перенаправляю на overlimit.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 голосов
/ 04 марта 2010

если вы можете определить брандмауэр (iptables / netfilter) на своем сервере, вы можете очень легко ограничить доступ. руководство о том, как это сделать, можно найти по адресу администратор Debian . это пример того, как защитить ssh-порт, но вы можете использовать ту же технику для http.

У меня все мои серверы "защищены", как это, и мне очень повезло с этим.

имейте в виду, что если у вас есть ajax-функциональность на вашем сайте, вам нужно гораздо больше запросов в минуту, как на не-ajax сайтах, разрешенных брандмауэром

0 голосов
/ 04 марта 2010

Объект HttpRequest имеет словарь META, в котором есть член REMOTE_ADDR, поэтому request.META["REMOTE_ADDR"] должен получить IP-адрес в представлении, который затем может установить overlimit в контексте ... Это то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...