限制Django每天的观看次数

时间:2010-03-04 00:27:36

标签: django

是否有一种简单的方法可以限制每天/每周给定IP地址访问视图的次数?某些书商使用该技术的简化版本来限制您可以预览的图书页数?

只有一种观点认为这种限制需要适用于 - 即。这不是一般限制 - 如果我可以在模板上下文中使用变量overlimit,那就太好了。解决方案不一定非常强大,但通过IP地址进行限制似乎比使用cookie更好。

我查看了session middleware,但据我所知,它没有提及跟踪IP地址。

有没有人遇到过这个问题?

3 个答案:

答案 0 :(得分:3)

我想出的解决方案利用django-hitcount应用程序和原始视图的“包装”。幸运的是,我有一个对象(Page),我可以将其与我想要限制的视图相关联,因此hitcount应用程序运行良好(并且主要是按照预期)。

我正在跟踪的视图是line_list - 所以我调用了新视图来包装它line_list_monitor并将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)

答案 1 :(得分:0)

HttpRequest对象有一个META成员字典,其中有一个REMOTE_ADDR成员,因此request.META["REMOTE_ADDR"]应该在视图中为您提供IP地址,然后可以设置上下文中的overlimit ......这就是你想要的吗?

答案 2 :(得分:0)

如果您能够在服务器上定义防火墙(iptables / netfilter),则可以非常轻松地限制访问。有关如何完成此操作的教程可以在debian administrator找到。这是一个如何保护ssh-port的示例,但您可以对http使用相同的技术。

我的所有服务器都“安全”,我很幸运。

请记住,如果您的网站上有ajax功能,则需要更多的请求/分钟,就像防火墙允许的非ajax网站一样