图形验证码¶
安装django-simple-captcha库¶
在网站开发的登录页面中,经常会需要使用到图形验证码来验证,在Django中,django-simple-captcha库包提供了图形验证码的使用。
$ pip install django-simple-captcha
# 如果安装有依赖库问题,清执行下面的安装
$ apt-get -y install libz-dev libjpeg-dev libfreetype6-dev python-dev
修改配置¶
INSTALLED_APPS = [
'captcha',
]
# CAPTCHA验证码设置
CAPTCHA_IMAGE_SIZE = (80, 45) # 设置 captcha 图片大小
CAPTCHA_LENGTH = 4 # 字符个数
CAPTCHE_RIMEOUT = 1 # 超时(minutes)
# 输出格式:输入框 验证码图片 隐藏域
CAPTCHA_OUTPUT_FORMAT = '%(text_field)s %(image)s %(hidden_field)s'
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null',
'captcha.helpers.noise_arcs', # 线
'captcha.helpers.noise_dots', # 点
)
# 随机字符验证码
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'
urls.py 添加
urlpatterns = [
path('captcha/', include('captcha.urls')), # 图片验证码路由
]
迁移数据库
$ python manage.py migrate
建立表单¶
# forms.py
from django import forms
from captcha.fields import CaptchaField
class LoginForm(forms.form):
username = forms.CharField(max_length=20,min_length=3)
password = forms.CharField(max_length=128,widget=forms.PasswordInput())
captcha = CaptchaField() # 验证码字段
实现¶
urls.py
urlpatterns = [
......
path('yzm/', views.user_login, name='yzm'),
]
login.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div> {{ msg }} </div>
<form action="{% url 'app03:yzm' %}" method="post">
{% csrf_token %}
用户:{{ form.username }} <span> {{ form.username.errors.0 }}</span> <br>
密码:{{ form.password }} <span> {{ form.password.errors.0 }}</span> <br>
验证码:{{ form.captcha }} <span> {{ form.captcha.errors.0 }}</span> <br>
<input type="submit">
</form>
</body>
</html>
<script src="https://cdn.bootcss.com/jquery/1.12.3/juqery.min.js"></script>
<script>
// 点击刷新验证码
$(function () {
$('.captcha').css({
'cursor': 'pointer'
});
// ajax刷新
$('.captcha').click(function () {
console.log('click');
$.get("/app/refresh/",
function (result) {
$('.captcha').attr('str', result['image_url']);
$('#id_captcha_0').val(result['key'])
});
});
})
</script>
views.py
import json
from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore
from django.contrib.auth import authenticate
import django.contrib.auth as auth
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
def user_login(request):
if request.method == "POST":
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user:
auth.login(request, user)
return redirect(reverse("app03:home"))
else:
form = LoginForm()
# 跳转登录页面
return render(request, 'app03/login.html', context={'form':form})