最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
python如何实现一个简单的验证码 python实现一个简单的验证码代码
时间:2020-12-09 编辑:袖梨 来源:一聚教程网
python如何实现一个简单的验证码?本篇文章小编给大家分享一下python实现一个简单的验证码代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
简单的验证码
(1)、我们在urls.py中定义一条路由,如下:
url(r'getcode', views.get_code, name="get_code"),
(2)、我们定义一个视图函数get_code(),如下:
from io import BytesIO from PIL import Image, ImageDraw, ImageFont from django.conf import settings from django.shortcuts import render, HttpResponse, redirect def get_code(request): """ 手撸一个验证码 """ # 定义图像颜色模型 mode = "RGB" # 定义图像尺寸 size = (200, 100) # 定义背景色 bg_color = (255, 0, 0) # 创建图像 image = Image.new(mode=mode, size=size, color=bg_color) # 创建画布 image_draw = ImageDraw.Draw(image, mode=mode) # 创建字体,第一个参数是字体,第二个参数是字体大小 image_font = ImageFont.truetype(settings.FONT_PATH, 100) # 创建一个验证码 verify_code = "Joke" # 生成验证码 fill_color = (255,255,255) for i in range(4): image_draw.text(xy=(50 * i, 0), text=verify_code[i], font=image_font, fill=fill_color) # 保存图像 fp = BytesIO() image.save(fp, "png") return HttpResponse(fp.getvalue(), content_type="image/png")
其中settings.FONT_PATH是我预先定义好的字段,如下
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "statics"),] FONT_PATH = os.path.join(os.path.join(STATICFILES_DIRS[0], "fonts"),"constan.ttf")
然后我们我们启动服务python manager.py runserver,在浏览器上就可以看到验证码生成了
能是实现了,但是我们现在是自定义了一个验证码字段,我们是需要随机生成验证码,而且字体颜色,背景颜色这些也不要定死了,然后我们再生成一些干扰点,我们对代码进行如下重构:
def get_code(request): """ 手撸一个验证码 """ # 定义图像颜色模型 mode = "RGB" # 定义图像尺寸 size = (200, 100) # 定义背景色 bg_color = (get_color(), get_color(), get_color()) # 创建图像 image = Image.new(mode=mode, size=size, color=bg_color) # 创建画布 image_draw = ImageDraw.Draw(image, mode=mode) # 创建字体,第一个参数是字体,第二个参数是字体大小 image_font = ImageFont.truetype(settings.FONT_PATH, 100) # 创建一个验证码 # verify_code = "Joke" verify_code = get_verify_code() # 生成验证码 # fill_color = (255,255,255) for i in range(4): fill_color = (get_color(),get_color(),get_color()) image_draw.text(xy=(50 * i, 0), text=verify_code[i], font=image_font, fill=fill_color) # 加入干扰点 for i in range(10000): fill_color = (get_color(),get_color(),get_color()) xy = (random.randrange(200), random.randrange(100)) image_draw.point(xy=xy,fill=fill_color) # 保存图像 fp = BytesIO() image.save(fp, "png") return HttpResponse(fp.getvalue(), content_type="image/png") def get_color(): """随机获取颜色""" return random.randrange(256) def get_verify_code(): """随机获取验证码""" verify_code = ''.join(random.choice(string.ascii_uppercase + string.digits + string.ascii_lowercase) for x in range(4)) return verify_code
然后我们重启应用,刷新页面如下
是不是有点神似了?下面我们创建一个简单的login页面,来实际应用一下验证码。
简单的登录页面
(1)、创建一个路由
url(r'login',views.login, name="login"),
(2)、创建一个Login的视图函数
def login(request): """登录页面""" if request.method == "POST": pass return render(request, "login.html")
(3)、创建一个login.html的template
Login
然后重启服务,浏览器访问如下
现在我们只是简单的搭建起了流程,我们需要的功能还没有实现,我们需要的功能有:
1、验证码校验
2、点击图片自动刷新验证码
3、忽略大小写
我们现在对项目进行重构,如下:
(1)、我们在get_code视图函数添加一行代码,如下
# 创建一个验证码 # verify_code = "Joke" verify_code = get_verify_code() # 加入session request.session['verify_code'] = verify_code ......
(2)、修改login视图函数,如下
def login(request): """登录页面""" if request.method == "POST": storage_code = request.session.get("verify_code") submit_code = request.POST.get("verify_code") if storage_code.lower() == submit_code.lower(): return HttpResponse("登录成功") return render(request, "login.html")
(3)、修改login.html代码如下
Login
相关文章
- Golang ProtoBuf的基本语法详解 10-20
- Python识别MySQL中的冗余索引解析 10-20
- Python+Pygame绘制小球代码展示 10-18
- Python中的数据精度问题介绍 10-18
- Python随机值生成的常用方法介绍 10-18
- python3解压缩.gz文件分析 09-27