是否有一种简单的方法可以限制每天/每周给定IP地址访问视图的次数?某些书商使用该技术的简化版本来限制您可以预览的图书页数?
只有一种观点认为这种限制需要适用于 - 即。这不是一般限制 - 如果我可以在模板上下文中使用变量overlimit
,那就太好了。解决方案不一定非常强大,但通过IP地址进行限制似乎比使用cookie更好。
我查看了session middleware,但据我所知,它没有提及跟踪IP地址。
有没有人遇到过这个问题?
答案 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网站一样