Решение, которое я придумал, использовало приложение 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)