用DJango的newform做Captcha(图片验证)

作者:半瓶墨水   链接:http://www.2maomao.com/blog/django-newform-captcha/

Captcha(图片验证)在很多网站上都有,不懂的参见月光的这篇文章

我用DJango做的代码在线加色小网站代码发芽网,也有许多地方需要Captcha,比如反馈页面
生成图片的代码网上有pycaptcha以及DJango-Captcha。我使用的是后者。

由于我喜欢使用newform,所以最初的想法是做个定制的Widget然后在Input里面搞定。后来发现这样做不到,因为Captcha一般需要在session中存储Captcha值,而从Widget里面访问session很别扭也不好办。陪着可爱老婆和还未出生的小宝宝出去溜了一圈回来,想到一个稍微绕一点儿的方法。

现在可以这么使用(其中的CaptchaInput和CaptchaUID是我自己写的,后面有下载):

captcha_uid = forms.CharField(
            
required=True,
            
label="",
            
max_length=40,
            
widget=CaptchaUID)
captcha = forms.CharField(
            
required=True,
            
label="验证信息",
            
max_length=1000,
            
widget=CaptchaInput)
 
def clean_captcha(self):
        
return validate_captcha(self)

界面是这个样子:
captcha.gif

我自己写的CaptchaUID和ChaptchaInput以及validate_captcha函数就不贴了,有兴趣自己下载看看,主要是render的时候的一些操作。

使用方法:
1. 下载:http://www.2maomao.com/blog/wp-content/uploads/captcha_2maomao.com.zip
2. 解压到你建立的Django工程下
3. 在你的settings.py里面修改,添加一个新的App:captcha,然后运行python manage.py syncdb
4. 更改urls.py添加 (r’^captcha/’, include(‘fayaa.captcha.urls’)),
5. 在你的form里面from yourproject.captcha.forms import *

然后就可以像上面我的form那样用了。注意captcha和captcha_uid这两个名字不能用其他的。

简陋是简陋了一点,但是这里着重的不是图片生成,而是与DJango newform的结合。你完全可以按照examples.py里面做出更复杂的Captcha认证来。

2 条评论 发表在“用DJango的newform做Captcha(图片验证)”上

  1. 秋丰说道:

    https://code.google.com/p/django-pycaptcha 我用这个的时候发现 widgets.py 里面用到
    from django.conf import settings 里面的两个配置 CAPTCHA_DEFAULT_CLASS 和 CAPTCHA_PERSISTENCE

    widgets.py 用到这两个配置 但是没有说明怎么配置 请问你知道吗 如果知道请发邮件给我 谢谢

  2. 半瓶墨水说道:

    @秋丰

    1. 自己看代码,在代码内搜搜很快就知道了
    2. 发信给这个作者问问

留下回复