这是一个图片验证码的库
安装: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',
)