django_simple_captcha

这是一个图片验证码的库

安装:pip install django_simple_captcha

python manage.py migrate  生成一个新的django_captchaStore表,保存每次生成的image_url 和 response(图片中验证码的小写)等信息。

url(r'^captcha', include('captcha.urls'))    用于点击图片刷新验证码, 这是captcha包自带的路由,只需这样写在 自己项目里就行,返回的json数据如下:
httpResponse:

 {"key": "71394b86c5da28f3fce36d956aaed226f2a02627", "image_url":"/captchaimage/71394b86c5da28f3fce36d956aaed226f2a02627/",

 "audio_url": null}

 

两种使用方法:

1.对于自定义表单样式不太友好,但是 会自动验证输入有误与否。

forms.py
from captcha.fields import CaptchaField, CaptchaTextInput
from django import forms
class CheckForm(froms.Form):
    #other fields
    picture_verify_code = CaptchaField(error_messages={"invalid": u"图片验证码错误"})
    #也可以带样式
    picture_verify_code = CaptchaField(widget=CaptchaTextInput(attrs={'placeholder': 'input something!'}), error_messages={"invalid": u"图片验证码错误"})

 
login.html
{{form.as_ul}}

#或者分条渲染

{{ form.picture_verify_code}}

#渲染出的效果和下面差不多图片在前,(不知道 能不能有更小单位的display),


captcha



#就算在form.py中添加了样式但是还是很丑很不友好。我不知道 如何给每个img 或者 input 单独加样式
但是目前为止她也可以自动验证验证码是否有误

 2. 自定义表单及验证

forms.py
from django import forms

class CheckForm(forms.Form):
    #这里 你甚至可以不定义captcha里面的fields
    #other fields

 

login.html


直接写成这种形式

captcha

如果这样写,不用form渲染,表单就不会自动检验验证码的正确与否,所以要手动验证。手动验证 也有两种方式

(1)写在view.py中

views.py

from captcha.models import CaptchaStore

def ajax_val(request):
    if request.is_ajax():
        cs = CaptchaStore.objects.filter(response=request.GET['response'],
                                    hashkey=request.GET['hashkey'])
        if cs:
            json_data = {'message': 'OK'}
        else:
            json_data = {'message': '图片验证码错误'}
        return JsonResponse(json_data)
    else:
        raise Http404

#在url中配置好路由,在某个动作由ajax异步调用,即时返回验证的结果,前端将错误信息填充到指定位置给用户看

(2)写在form.py 中

forms.py

class CheckForm(forms.Form):
    #省略一些代码
    def clean(self):
        #在进行表单验证的同时验证图片验证码。利用form.ValidationError将错误信息给用户看到
        picture_verify_code = self.data.get('picture_verify_code_1', '')
        hashkey = self.data.get('picture_verify_code_0')
        #手动验证 图片验证码是否正确
        cs = CaptchaStore.objects.filter(response=str.lower(picture_verify_code), hashkey=hashkey)
        if not cs:
            raise forms.ValidationError(
                self.error_messages['picture_verify_error'],
                code='picture_verify_error',
            )

 

你可能感兴趣的:(django_simple_captcha)