下面是Django实现随机图形验证码的完整攻略:
1. 安装依赖包
实现随机图形验证码需要使用到Python的pillow库,因此需要先安装依赖包:
pip install pillow
2. 创建验证码视图函数
在Django项目的一个应用中创建一个验证码视图函数,如下所示:
from io import BytesIO
from random import randint
from django.http import HttpResponse
from django.conf import settings
from PIL import Image, ImageDraw, ImageFont
def get_random_color():
"""
获取随机颜色
"""
return randint(0, 255), randint(0, 255), randint(0, 255)
def generate_captcha(request):
"""
生成随机验证码并返回图片
"""
# 获取验证码配置
captcha_length = getattr(settings, 'CAPTCHA_LENGTH', 4)
captcha_height = getattr(settings, 'CAPTCHA_HEIGHT', 30)
captcha_width = getattr(settings, 'CAPTCHA_WIDTH', 80)
captcha_font_size = getattr(settings, 'CAPTCHA_FONT_SIZE', 25)
# 生成随机字符串
captcha_string = ''
for i in range(captcha_length):
captcha_string += str(randint(0, 9))
# 创建图片对象
image = Image.new(mode='RGB', size=(captcha_width, captcha_height), color=get_random_color())
# 创建画笔对象
draw = ImageDraw.Draw(image)
# 加载字体
font = ImageFont.truetype('arial.ttf', captcha_font_size)
# 填写验证码
for i in range(captcha_length):
x = int(captcha_width / captcha_length * i)
y = randint(0, captcha_height - captcha_font_size)
draw.text(xy=(x, y), text=captcha_string[i], font=font, fill=get_random_color())
# 干扰线
for i in range(6):
x1, y1 = randint(0, captcha_width), randint(0, captcha_height)
x2, y2 = randint(0, captcha_width), randint(0, captcha_height)
draw.line(xy=(x1, y1, x2, y2), fill=get_random_color(), width=1)
# 抗锯齿
image = image.filter(ImageFilter.SMOOTH)
# 保存验证码
request.session['captcha'] = captcha_string
# 将图片以文件流的形式返回
buffer = BytesIO()
image.save(buffer, 'jpeg')
return HttpResponse(buffer.getvalue(), 'image/jpeg')
可以看到,这个视图函数主要是通过Pillow库和Python随机数函数生成一张随机图形验证码,并将验证码保存到session中。
需要注意的是,这个视图函数需要在Django的URLConf中进行注册。
3. 使用验证码
在需要使用验证码的地方,可以将其显示在页面上,供用户输入。
假设要在登录界面中使用验证码,可以先在urls.py中注册验证码视图函数:
urlpatterns = [
#...
url(r'^captcha/$', views.generate_captcha, name='captcha'),
#...
]
然后在登录页面的HTML文件中,通过调用验证码视图函数的URL将验证码显示在页面上:
{% block content %}
<h3>登录</h3>
<form method="post">
{% csrf_token %}
{{ form.username }}
{{ form.password }}
<img src="{% url 'captcha' %}" />
<input type="text" name="captcha" />
<input type="submit" value="登录" />
</form>
{% endblock %}
当用户提交登录表单时,可以通过比较用户输入的验证码和session中保存的验证码来判断用户输入是否正确,具体代码可以参考下面的示例代码:
def login(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
captcha = request.POST.get('captcha', '')
if captcha.lower() == request.session.get('captcha', '').lower():
# 验证码正确,继续登录验证
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')
else:
return HttpResponse('用户名或密码错误')
else:
# 验证码错误,返回错误信息
return HttpResponse('请输入正确的验证码')
else:
form = LoginForm()
return render(request, 'login.html', {'form': form})
这个函数首先判断用户输入的验证码是否和session中的验证码一致,如果不一致则返回错误信息;如果一致,则继续进行登录验证。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django实现随机图形验证码的示例 - Python技术站