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