django_simple_captcha

周凯捷
2023-12-01

这是一个图片验证码的库

安装: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),


<img src="#" class="captcha" alt="captcha">
<input type="text"  id="id_picture_verify_code_1" required="True" name="picture_verify_code_1"  placeholder="图片验证码" autocapitalize="off" autocomplete="off" autocorrect="off" spellcheck="false">
<input id="id_picture_verify_code_0" name="picture_verify_code_0" type="hidden" required value="">

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

 2. 自定义表单及验证

forms.py
from django import forms

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

 

login.html


直接写成这种形式
<input type="text"  id="id_picture_verify_code_1" required="True" name="picture_verify_code_1"  placeholder="图片验证码" autocapitalize="off" autocomplete="off" autocorrect="off" spellcheck="false">
<img src="#" class="captcha" alt="captcha">
<input id="id_picture_verify_code_0" name="picture_verify_code_0" type="hidden" required value="">

如果这样写,不用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',
            )

 

 类似资料:

相关阅读

相关文章

相关问答