Django我的解决反垃圾邮件请求的方法怎么样?有更好的解决方案吗?

时间:2014-04-16 11:55:51

标签: python django

我对这类工作没什么经验,我找不到适合我需要的应用程序。所以我必须编写自己的代码。但我不知道是否有更好的方法,这就是我在这里的原因。

我知道这个应用程序django-simple-captcha,这很好,但还不够,因为我想做一个更合理的工作,也就是说,我不想让普通用户填写验证码字段。我想要的是:如果用户在我定义的ALLOW_TIMES内发送超过CHECK_SECONDS的帖子请求,则request.is_attack将为True,我将知道呈现django-simple-captcha形式而不是正常形式。

我尝试了这种方法,使用自定义中间件:我在全局字典中记录用户的每个帖子请求信息,以决定request.is_attack的值。

import datetime

datetime_now = datetime.datetime.now
USER_POST_INFO={}
CHECK_SECONDS=60
ALLOW_TIMES=3

class AntiAttackMiddleware(object):

    def process_request(self, request):
        '''
        if this user send more than ALLOW_TIMES request
        in CHECK_SECONDS, set request.is_attack to True,
        otherwise False
        '''
        user = request.user
        if request.method == "POST" and user.is_authenticated():
            now = datetime_now()
            if user.pk not in USER_POST_INFO:
                USER_POST_INFO[user.pk]={
                    'time':now,
                    'total':1,
                    'attack':False,
                }
                request.is_attack=False
            else:
                d = USER_POST_INFO[user.pk]
                if d['time'] + datetime.timedelta(seconds=CHECK_SECONDS) > now :
                    d['total'] +=1
                    if d['total']>ALLOW_TIMES:
                        d['attack']=True
                else:
                    d['time']=now
                    d['attack']=False
                request.is_attack=d['attack']

在views.py

def formview(request):
    if request.is_attack:
        #render captcha form
    else:
        #render normal form

0 个答案:

没有答案