zoukankan      html  css  js  c++  java
  • django验证码配置与使用

    1.安装django-simple-captcha

    pip install django-simple-captcha
    

    2.配置settings.py

    ##加app列表
    INSTALLED_APPS =[
    # 校验码
    'captcha',

    ]
    ## django_simple_captcha 验证码配置 # 格式 CAPTCHA_OUTPUT_FORMAT = u'%(text_field)s %(hidden_field)s %(image)s' # 字体倾斜度 CAPTCHA_LETTER_ROTATION = (-70, 35) # 噪点样式 CAPTCHA_NOISE_FUNCTIONS = ( # 'captcha.helpers.noise_null', # 没有样式 'captcha.helpers.noise_arcs', # 线 'captcha.helpers.noise_dots', # 点 ) # 图片大小 CAPTCHA_IMAGE_SIZE = (90, 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 = 3 # 超时时间(minutes),默认为5分钟 # 是否测试模式,测试模式下输入任何字符都可通过 CAPTCHA_TEST_MODE = False # CAPTCHA_MATH_CHALLENGE_OPERATOR='math_challenge'

     3.迁移数据库

    # 生成迁移文件
    python manage.py makemigrations 
    # 生成数据表
    python manage.py migrate
    

      迁移成功后,数据库生成captcha_captchastore表,models.py如下

    class CaptchaStore(models.Model):
        challenge = models.CharField(blank=False, max_length=32) # 验证码
        response = models.CharField(blank=False, max_length=32) # 验证码,回复时验证
        hashkey = models.CharField(blank=False, max_length=40, unique=True) # 唯一标识key
        expiration = models.DateTimeField(blank=False) # 过期时间
    
        def save(self, *args, **kwargs):
            self.response = self.response.lower()
            if not self.expiration:
                self.expiration = get_safe_now() + datetime.timedelta(minutes=int(captcha_settings.CAPTCHA_TIMEOUT))
            if not self.hashkey:
                key_ = (
                    smart_text(randrange(0, MAX_RANDOM_KEY)) +
                    smart_text(time.time()) +
                    smart_text(self.challenge, errors='ignore') +
                    smart_text(self.response, errors='ignore')
                ).encode('utf8')
                self.hashkey = hashlib.sha1(key_).hexdigest()
                del(key_)
            super(CaptchaStore, self).save(*args, **kwargs)
    
        def __unicode__(self):
            return self.challenge
    
        def remove_expired(cls):
            cls.objects.filter(expiration__lte=get_safe_now()).delete()
        remove_expired = classmethod(remove_expired)
    
        @classmethod
        def generate_key(cls):
            challenge, response = captcha_settings.get_challenge()() # 生成验证码
            store = cls.objects.create(challenge=challenge, response=response) # 验证码存库
    
            return store.hashkey
    

     

    4.urls.py配置

    urlpatterns += [
        url(r'^captcha/', include('captcha.urls')),
    ]
    

     5.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={"class": "form-control", "placeholder": "请输入邮箱账号", "value": "", "required": "required",}), max_length=50,error_messages={"required": "用户名不能为空",}) password = forms.CharField(widget=forms.PasswordInput(
                      attrs={"class": "form-control", "placeholder": "请输入密码", "value": "", "required": "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: print 'except: '+ str(e) raise forms.ValidationError(u"验证码有误,请重新输入") # 用户名 try: username=self.cleaned_data['username'] except Exception as e: print 'except: '+ str(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: print 'except: '+ str(e) raise forms.ValidationError(u"请输入至少8位密码"); return self.cleaned_data

     6.views.py

    # 注册
    # 改为ajax post 
    def register(request):
        if request.method == 'POST':
            # 验证码
            print 'captcha_0: ' + request.POST.get('captcha_0')
            print 'captcha_1: ' + request.POST.get('captcha_1')
            try:
                reg_form = RegisterForm(request.POST)
            except Exception as e:
                print str(e)
                # 登录失败 返回错误提示    
                err = "注册失败,请重试"
                return result_response(request, err) 
     
            if reg_form.is_valid():
                print "register success"
                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()
    #         # 指定默认的登录验证方式 user.backend = 'django.contrib.auth.backends.ModelBackend' # 验证成功登录 auth.login(request, user) return result_response(request, "") except Exception as e: print str(e) setFormTips(reg_form, "注册失败,请重试") else: print "register failed" if request.POST.get('captcha_1') == "": setFormTips(reg_form, "验证码不能为空") # 登录失败 返回错误提示 err = getFormTips(reg_form) return result_response(request, err) else: reg_form = RegisterForm() return render(request, 'index.html', locals())

     7.html模板中显示验证码

    第一种:
    {{ reg_form.captcha }}
    ###这种方法对页面的适应性不太好,如上面模板变量生成html如下:
    <input autocomplete="off" id="id_captcha_1" name="captcha_1" type="text">
    <input id="id_captcha_0" name="captcha_0" type="hidden" value="e91228ab45df7338b59b64cb0eae1b60a48fd125">
    <img src="/%2Fimage/e91228ab45df7338b59b64cb0eae1b60a48fd125/" alt="captcha" class="captcha">
    
    第二种:
    #views.py
    from captcha.models import CaptchaStore
    from captcha.helpers import captcha_image_url
    hashkey = CaptchaStore.generate_key()
    imgage_url = captcha_image_url(hashkey)
    ###这种方法给刷新验证码提供了方便,生成html如下:
    <input type="text"  id="id_reg_captcha_1" name="captcha_1" class="form-control form-control-captcha fl" placeholder="请输入验证码">
    <span class="v5-yzm fr"><a href="#" class="next-captcha"><img src="{{ imgage_url }}" class="captcha" alt="captcha">换一张</a></span>
    <input id="id_reg_captcha_0" name="captcha_0" type="hidden" value="{{ hashkey }}">

     8.刷新验证码

    前台js

      // 刷新验证码
      $(".next-captcha").click(function(){
          $.getJSON("{% url 'refresh-captcha' %}", function(json) {
              // This should update your captcha image src and captcha hidden input
              // debugger;
              var status = json['status'];
              var new_cptch_key = json['new_cptch_key'];
              var new_cptch_image = json['new_cptch_image'];
              id_captcha_0 = $("#id_reg_captcha_0");
              img = $(".captcha");
              id_captcha_0.attr("value", new_cptch_key);
              img.attr("src", new_cptch_image);
          });
          
      });
    

     后台代码

    # 刷新验证码
    def refresh_captcha(request):
        to_json_response = dict()
        to_json_response['status'] = 1
        to_json_response['new_cptch_key'] = CaptchaStore.generate_key()
        to_json_response['new_cptch_image'] = captcha_image_url(to_json_response['new_cptch_key'])
        return HttpResponse(json.dumps(to_json_response), content_type='application/json')
    
  • 相关阅读:
    20175202 《Java程序设计》第六周学习总结
    2018-2019-2 20175202实验一《Java开发环境的熟悉》实验报告
    20175202 《Java程序设计》迭代和JDB
    20175202 《Java程序设计》第五周学习总结
    20175202 《Java程序设计》第三周学习总结
    20175202 《Java程序设计》第四周学习总结
    第六周学习总结
    java第一次实验
    第五次学习总结
    第四次学习总结
  • 原文地址:https://www.cnblogs.com/konglingxi/p/9435421.html
Copyright © 2011-2022 走看看