十八 Django-验证码

一、验证码的作用

防恶意破解密码:防止,使用程序或机器人恶意去试密码.为了提高用户的体验,用户输入错误以后,才会要求输入验证码.

防论坛灌水:这个是很常见的。有一种程序叫做顶帖机,如果无限制的刷,整个论坛可能到处是拉圾信息,比如,百度贴吧,你只要是新用户或者刚刚关注的贴吧,要是发帖,会马上出现验证码。
有效防止注册:防止使用程序或机器人去无限制注册账号.
防刷票:网上有很多投票类的网站.
反爬:防止爬虫爬取数据

二、原理

验证码于服务器端生成,发送给客户端,并以图像格式显示。客户端提交所显示的验证码,客户端接收并进行比较,若比对失败则不能实现登录或注册,反之成功后跳转相应界面。
流程

三、如何实现

1、前期配置

  1. 安装pillow
    pip install Pillow
    
  2. 安装django-simple-captcha
    pip install  django-simple-captcha==0.5.6
    
  3. 将captcha添加到setting的app中
    INSTALLED_APPS = [
        'captcha',
    ]
    
  4. 添加urls.py
    urlpatterns += [
        url(r'^captcha/', include('captcha.urls')),
    ]
    
  5. 配置
    # django_simple_captcha 验证码配置   
    # 格式  
    CAPTCHA_OUTPUT_FORMAT = u'%(text_field)s %(hidden_field)s %(image)s'  
    # 噪点样式  
    CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null', # 没有样式  
        # 'captcha.helpers.noise_arcs', # 线  
        # 'captcha.helpers.noise_dots', # 点  
    )  
    # 图片大小  
    CAPTCHA_IMAGE_SIZE = (100, 25)  
    CAPTCHA_BACKGROUND_COLOR = '#ffffff'  
    CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' # 图片中的文字为随机英文字母,如 mdsh  
    # CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'    # 图片中的文字为数字表达式,如1+2=</span>  
    CAPTCHA_LENGTH = 4 # 字符个数  
    CAPTCHA_TIMEOUT = 1 # 超时(minutes)  
    

2、示例代码

  1. forms.py
    from django import forms
    from maiziedu.models import UserProfile
    from captcha.fields import CaptchaField
    class RegisterForm(forms.Form):
        '''
        注册
        '''
    username = forms.EmailField(widget=forms.TextInput(attrs={"placeholder": "请输入邮箱账号", "value": "", "required": "用户名不能为空",}),max_length=50,error_messages={"required": "用户名不能为空",})
     password = forms.CharField(widget=forms.PasswordInput(attrs={"placeholder": "请输入密码", "value": "", "required": "密码不能为空",}),min_length=8, max_length=50,error_messages={"required": "密码不能为空",})
        # 验证码
        captcha = CaptchaField()
        def clean(self):
            # 验证码
            try:            
                captcha_x = self.cleaned_data['captcha']            
            except Exception as e:
                raise forms.ValidationError(u"验证码有误,请重新输入")
             # 用户名
            try:
                username=self.cleaned_data['username']
            except Exception as e:
                raise forms.ValidationError(u"注册账号需为邮箱格式")    
            # 登录验证        
            is_email_exist = UserProfile.objects.filter(email=username).exists() 
            is_username_exist = UserProfile.objects.filter(username=username).exists() 
            if is_username_exist or is_email_exist:
                raise forms.ValidationError(u"该账号已被注册")
            # 密码
            try:
                password=self.cleaned_data['password']
            except Exception as e:
                raise forms.ValidationError(u"请输入至少8位密码");
            return self.cleaned_data 
    
  2. 刷新验证码
    # 刷新验证码  
    def refresh_captcha(request):  
        verify= dict()  
        verify['cptch_key'] = CaptchaStore.generate_key()  
        verify['cptch_image'] = verify(to_json_response['cptch_key'])  
        return HttpResponse(json.dumps(verify), content_type='application/json')  
    
  3. views.py
    def register(request):  
        if request.method == 'POST':  
            # 验证码  
            try:  
                reg_form = RegisterForm(request.POST)  
            except Exception as e:  
                # 登录失败 返回错误提示      
                err = "注册失败,请重试"  
                return result_response(request, err)   
            if reg_form.is_valid():  
                try:  
                    username = reg_form.cleaned_data['username']  
                    password = reg_form.cleaned_data['password']  
                    user = UserProfile.objects.create(username = username, email = username,   
                    password = make_password(password), is_active = True)  
                    user.save()  
                    # 验证成功登录  
                    auth.login(request, user)  
                    return result_response(request, "")  
                except Exception as e:  
                    setFormTips(reg_form, "注册失败,请重试")  
            else:  
                if request.POST.get('captcha_1') == "":  
                    setFormTips(reg_form, "验证码不能为空")   
            # 登录失败 返回错误提示      
            err = getFormTips(reg_form)  
            return result_response(request, err)   
        else:  
            reg_form = RegisterForm()  
            #  locals() 传递所有变量
        return render(request, 'index.html', locals())  
    
  4. 刷新验证码
        $(function () {
                let refres_url = 'http://127.0.0.1:8000/account/verify/';
                $('.captcha').click(function () {
                    $.getJSON(refres_url, function (data) {
                        $('.captcha').attr('src', data.img_url)
                        $('#id_capt_0').val(data.haskey)
                    })
                })
            })
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351