在 Django 中限制每天的查看次数
Posted
技术标签:
【中文标题】在 Django 中限制每天的查看次数【英文标题】:Limit number of views per day in Django 【发布时间】:2010-03-04 00:27:35 【问题描述】:是否有一种简单的方法可以限制给定 IP 地址每天/每周可以访问视图的次数?一些书商用来限制您可以预览的书页数的技术的简化版本?
只有一种观点需要适用此限制——即这不是一般的限制——如果我可以在模板上下文中有一个变量overlimit
,那就太好了。该解决方案不需要非常强大,但通过 IP 地址进行限制似乎比使用 cookie 更好。
我查看了session middleware,但据我所知,它没有提及跟踪 IP 地址。
有人遇到过这个问题吗?
【问题讨论】:
【参考方案1】:我提出的解决方案利用了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)
【讨论】:
【参考方案2】:HttpRequest
对象有一个META
成员字典,其中有一个REMOTE_ADDR
成员,所以request.META["REMOTE_ADDR"]
应该在视图中为您获取IP 地址,然后可以在上下文中设置overlimit
。 . 这就是你想要的吗?
【讨论】:
但我需要保持计数。现在我认为这需要一个新模型来跟踪 IP 的视图请求......不过我想我可能会避免这种情况。 只是回答提出的问题。任何解决方案都需要创建每个 IP 或每个用户的模型来跟踪用户。您所说的那种系统并不是非常健壮,并且可能相对容易通过代理或动态 IP 分配来规避。会话实际上是为了防止用户需要为他们执行的每一个操作提供用户 ID 和密码,即为用户和站点操作员提供便利。如果您尝试使用它来限制用户,他们会找到解决方法。此外,如果页面加载失败,它可以欺骗用户。【参考方案3】:如果您能够在您的服务器上定义防火墙(iptables/netfilter),您可以非常轻松地限制访问。可以在debian administrator 找到如何完成此操作的教程。这是一个如何保护 ssh 端口的示例,但您可以对 http 使用相同的技术。
我的所有服务器都像这样“保护”了,我很幸运。
请记住,如果您的网站具有 ajax 功能,则您需要更多的请求/分钟,例如防火墙允许的非 ajax 网站
【讨论】:
那么防火墙可以限制每个IP每天对特定范围网页的访问次数为一定数量,同时允许对站点的其余部分进行无限制访问?听起来像是深度数据包检查。以上是关于在 Django 中限制每天的查看次数的主要内容,如果未能解决你的问题,请参考以下文章
django系列8.4--django中间件的可应用案例, 限制请求次数与时间