⽤python实现⼀个简单的验证码
⽬录
简单的验证码
简单的登录页⾯
我们经常在登录⼀个⽹站,或者注册的时候需要输⼊⼀个验证码,有时候觉得很烦,因为有些验证码不仅复杂还看不清,许多⽤户就会因为这些⽽懒得再登录或者注册之类的。
既然验证码会造成流失⽤户的风险,为什么⼤家都还要使⽤验证码呢?
这是验证码在⼀定程度上起到保护⽹站安全的作⽤,⽐如防⽌⼤规模恶意注册(⽐如⼿机验证码形式,⼀机⼀户),再⽐如反爬⾍(⾄少不会轻易让你爬取数据)等,你看⽤户基数最⼤的12306,就会有各种验证码。
既然验证码这么重要,它的原理是什么?是怎么实现的?
它的原理其实很简单,就是在服务器端⽣成验证码,发送给客户端,并以图像格式显⽰。客户端提交所显⽰的验证码,服务端接收并进⾏⽐较,若⽐对失败则不能实现登录或注册,反之成功后跳转相应界⾯。
我们知道了其原理,实现起来就很简单了,现在⽹络上也有各种各样已经做好的验证码,我们完全可以拿来即⽤。但是为了更好的理解其原理,我们来⼿撸⼀个简单的验证码,以下是在Django中实现。
简单的验证码
(1)、我们在urls.py中定义⼀条路由,如下:
url(r'getcode', _code, name="get_code"),
(2)、我们定义⼀个视图函数get_code(),如下:
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
f import settings
from django.shortcuts import render, HttpResponse, redirect
def get_code(request):
"""
⼿撸⼀个验证码
"""
# 定义图像颜⾊模型
mode = "RGB"
# 定义图像尺⼨
size = (200, 100)
# 定义背景⾊
bg_color = (255, 0, 0)
# 创建图像
image = w(mode=mode, size=size, color=bg_color)
# 创建画布
image_draw = ImageDraw.Draw(image, mode=mode)
# 创建字体,第⼀个参数是字体,第⼆个参数是字体⼤⼩
image_font = uetype(settings.FONT_PATH, 100)
# 创建⼀个验证码
verify_code = "Joke"
# ⽣成验证码
fill_color = (255,255,255)
for i in range(4):
(xy=(50 * i, 0), text=verify_code[i], font=image_font, fill=fill_color)
# 保存图像
fp = BytesIO()
image.save(fp, "png")
return value(), 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"),"f")
然后我们我们启动服务python manager.py runserver,在浏览器上就可以看到验证码⽣成了
能是实现了,但是我们现在是⾃定义了⼀个验证码字段,我们是需要随机⽣成验证码,⽽且字体颜⾊,背景颜⾊这些也不要定死了,然后我们再⽣成⼀些⼲扰点,我们对代码进⾏如下重构:
def get_code(request):
"""
⼿撸⼀个验证码
"""
# 定义图像颜⾊模型
mode = "RGB"
# 定义图像尺⼨
size = (200, 100)
# 定义背景⾊
bg_color = (get_color(), get_color(), get_color())
# 创建图像
image = w(mode=mode, size=size, color=bg_color)
# 创建画布
image_draw = ImageDraw.Draw(image, mode=mode)
# 创建字体,第⼀个参数是字体,第⼆个参数是字体⼤⼩
image_font = uetype(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())
(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 value(), 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):
html怎么实现登录验证功能"""登录页⾯"""
hod == "POST":
pass
return render(request, "login.html")
(3)、创建⼀个login.html的template
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="{% url 'app01:login' %}" method="post">
{% csrf_token %}
<span>⽤户名:</span><input type="text" name="username">
<br>
<span>验证码:</span><input type="text" name="verify_code">
<br>
<img src="{% url 'app01:get_code' %}" alt="">
<br>
<button>登录</button>
</form>
</body>
</html>
然后重启服务,浏览器访问如下
现在我们只是简单的搭建起了流程,我们需要的功能还没有实现,我们需要的功能有:
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):
"""登录页⾯"""
hod == "POST":
storage_code = ("verify_code")
submit_code = ("verify_code")
if storage_code.lower() == submit_code.lower():
return HttpResponse("登录成功")
return render(request, "login.html")
(3)、修改login.html代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="{% url 'app01:login' %}" method="post">
{% csrf_token %}
<span>⽤户名:</span><input type="text" name="username">
<br>
<span>验证码:</span><input type="text" name="verify_code">
<br>
<img src="{% url 'app01:get_code' %}" alt="" name="verify_image">
<br>
<button>登录</button>
</form>
<script src="cdn.bootcss/jquery/3.2.0/jquery.js"></script>
<script>
$(function () {
$("img").on("click", function () {
console.log("来了啊")
$(this).attr("src","{% url 'app01:get_code' %}"+"?id="+Math.random())
})
})
</script>
</body>
</html>
然后就可以愉快的玩耍了,是不是很简单呢?
以上就是⽤python实现⼀个简单的验证码的详细内容,更多关于python 实现验证码的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论