限制Django每天的浏览量

限制Django每天的浏览量,django,Django,是否有一种简单的方法可以限制给定IP地址每天/每周访问视图的次数?一些书商使用简化版的技术来限制你可以预览的书的页数 这个限制只需要应用于一个视图——也就是说,它不是一般的限制——如果我可以在模板上下文中有一个变量overlimit,那就太好了。该解决方案不需要非常健壮,但受IP地址限制似乎比使用cookie更好 我已经调查过了,但据我所知,它没有提到跟踪IP地址 有人遇到过这个问题吗?该对象有一个META成员字典,其中有一个REMOTE\u ADDR成员,因此request.META[“REM

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

这个限制只需要应用于一个视图——也就是说,它不是一般的限制——如果我可以在模板上下文中有一个变量
overlimit
,那就太好了。该解决方案不需要非常健壮,但受IP地址限制似乎比使用cookie更好

我已经调查过了,但据我所知,它没有提到跟踪IP地址


有人遇到过这个问题吗?

该对象有一个
META
成员字典,其中有一个
REMOTE\u ADDR
成员,因此
request.META[“REMOTE\u ADDR”]
应该在视图中获取IP地址,然后可以在上下文中设置
overlimit
。。。这就是你想要的吗?

对象有一个
META
成员字典,它有一个
REMOTE\u ADDR
成员,因此
request.META[“REMOTE\u ADDR”]
应该在视图中获取IP地址,然后可以在上下文中设置
overlimit
。。。这就是您想要的吗?

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

我所有的服务器都是这样“安全”的,我非常幸运


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

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

我所有的服务器都是这样“安全”的,我非常幸运


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

我提出的解决方案利用了应用程序和原始视图的“包装”。幸运的是,我有一个对象(
页面
),我可以将它与我试图限制的视图关联起来,因此hitcount应用程序运行良好(并且基本上符合预期)

我正在跟踪的视图是
line\u list
——因此我调用了新视图来包装它
line\u list\u monitor
,并将
line\u list
的原始url与之关联。新视图包含在下面。如果所讨论的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)

我提出的解决方案利用了应用程序和原始视图的“包装”。幸运的是,我有一个对象(
页面
),我可以将它与我试图限制的视图关联起来,因此hitcount应用程序运行良好(并且基本上符合预期)

我正在跟踪的视图是
line\u list
——因此我调用了新视图来包装它
line\u list\u monitor
,并将
line\u list
的原始url与之关联。新视图包含在下面。如果所讨论的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)

但我需要继续计算。现在我认为这需要一个新的模型来跟踪IP的视图请求。。。我想我可能会避免这样。只是回答提出的问题。任何解决方案都需要创建每IP或每用户模型来跟踪用户。你所说的那种系统并不是非常健壮,而且可能相对容易通过代理或动态IP分配来规避。会话实际上是为了防止用户需要为他们采取的每一个操作提供用户Id和密码,即方便用户和站点操作员。如果你试图用它来限制用户,他们会找到一个绕过它的方法。此外,如果页面加载失败,它可能会欺骗用户。但我需要保持运行计数。现在我认为这需要一个新的模型来跟踪IP的视图请求。。。我想我可能会避免这样。只是回答提出的问题。任何解决方案都需要创建每IP或每用户模型来跟踪用户。你所说的那种系统并不是非常健壮,而且可能相对容易通过代理或动态IP分配来规避。会话实际上是为了防止用户需要为他们采取的每一个操作提供用户Id和密码,即方便用户和站点操作员。如果你试图用它来限制用户,他们会找到一个绕过它的方法。此外,如果页面加载失败,它可能会欺骗用户。因此,防火墙可以将每天访问特定范围的网页的次数限制为每个IP的特定次数,同时允许不受限制地访问网站的其余部分?听起来像是深度数据包检查。那么防火墙可以将每天访问特定范围的网页的次数限制为每个IP的特定次数,同时允许不受限制地访问网站的其余部分?听起来像是深度包检查。