下面是用Python实现一个简单验证码的完整攻略。
简单验证码的实现
需要用到的第三方库
- Pillow (Python Imaging Library)
假设我们要生成一个 4 位数字的验证码。
下面是完整的示例代码:
import random
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
def generate_verification_code(code_len=4, width=120, height=30, font_size=25):
"""
生成验证码的函数
:param code_len: 验证码的字符数
:param width: 验证码图片的宽度
:param height: 验证码图片的高度
:param font_size: 验证码字体大小
:return: (验证码字符串,验证码图片二进制数据)
"""
# 生成随机的验证码字符串
code = ''.join([str(random.randint(0, 9)) for _ in range(code_len)])
# 创建画布
im = Image.new('RGB', (width, height), (255, 255, 255))
# 创建画笔
draw = ImageDraw.Draw(im)
# 创建字体对象
font = ImageFont.truetype('arial.ttf', font_size)
# 计算字符大小和位置
font_width, font_height = font.getsize(code[0])
x = (width - code_len * font_width) // 2
y = (height - font_height) // 2
# 画字符
for i in range(code_len):
c = code[i]
draw.text((x + font_width * i, y), c, (0, 0, 0), font)
# 画干扰线
for i in range(random.randint(1, 3)):
x1 = random.randint(0, width)
y1 = random.randint(0, height)
x2 = random.randint(0, width)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=(0, 0, 0))
# 画干扰点
for i in range(random.randint(100, 150)):
draw.point((random.randint(0, width), random.randint(0, height)), fill=(0, 0, 0))
# 生成验证码图片二进制数据
f = BytesIO()
im.save(f, 'png')
f.seek(0)
return code, f.read()
该函数的使用方法如下:
code, data = generate_verification_code()
# ... 将 data 发送给前端 ...
示例1
在 Django 中使用该函数实现一个简单的验证码视图:
from django.http import HttpResponse
def captcha_view(request):
# 生成验证码
code, data = generate_verification_code()
# 设置响应头
response = HttpResponse(data, content_type='image/png')
response['Content-Length'] = len(data)
# 将验证码字符串保存到 session 中
request.session['captcha'] = code
# 返回 HttpResponse 对象
return response
在模板中使用此视图的方式如下:
<img src="{% url 'captcha_view' %}" alt="captcha">
<input type="text" name="captcha">
示例2
在 Flask 中使用该函数实现一个简单的验证码视图:
from flask import Flask, Response, session
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/captcha')
def captcha_view():
# 生成验证码
code, data = generate_verification_code()
# 将验证码字符串保存到 session 中
session['captcha'] = code
# 返回 Response 对象
return Response(data, content_type='image/png')
if __name__ == '__main__':
app.run()
在模板中使用此视图的方式如下:
<img src="{{ url_for('captcha_view') }}" alt="captcha">
<input type="text" name="captcha">
以上就是一个简单验证码的完整实现过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用python实现一个简单的验证码 - Python技术站