我们经常在登录一个网站,或者注册的时候需要输入一个验证码,有时候觉得很烦,因为有些验证码不仅复杂还看不清,许多用户就会因为这些而懒得再登录或者注册之类的。

既然验证码会造成流失用户的风险,为什么大家都还要使用验证码呢?

这是验证码在一定程度上起到保护网站安全的作用,比如防止大规模恶意注册(比如手机验证码形式,一机一户),再比如反爬虫(至少不会轻易让你爬取数据)等,你看用户基数最大的12306,就会有各种验证码。

既然验证码这么重要,它的原理是什么?是怎么实现的?

它的原理其实很简单,就是在服务器端生成验证码,发送给客户端,并以图像格式显示。客户端提交所显示的验证码,服务端接收并进行比较,若比对失败则不能实现登录或注册,反之成功后跳转相应界面。

我们知道了其原理,实现起来就很简单了,现在网络上也有各种各样已经做好的验证码,我们完全可以拿来即用。但是为了更好的理解其原理,我们来手撸一个简单的验证码,以下是在Django中实现。

简单的验证码

(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

{% csrf_token %}

用户名:

验证码:

登录

然后重启服务,浏览器访问如下

现在我们只是简单的搭建起了流程,我们需要的功能还没有实现,我们需要的功能有:

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

{% csrf_token %}

用户名:

验证码:

登录

$(function () {

$("img").on("click", function () {

console.log("来了啊")

$(this).attr("src","{% url 'app01:get_code' %}"+"?id="+Math.random())

})

})

然后就可以愉快的玩耍了,是不是很简单呢?

以上就是用python实现一个简单的验证码的详细内容,更多关于python 实现验证码的资料请关注脚本之家其它相关文章!

python编写一个登陆验证程序_用python实现一个简单的验证码相关推荐

  1. python编写统计选票的程序_使用python编写微信公众号发稿统计程序

    近日为学校公众号统计发稿情况,需统计本年度各部门分别所发稿件标题.时间.作者等. 首先考虑查看公众号后台有无统计功能,看到的界面如下: 每页只显示7天的消息,且没有部门作者信息.再看另一界面: 只统计 ...

  2. python编写win 本地reader程序_使用Python、win32api和Acrobat Reader 9打印PDF

    我有报告,我要发送到一个系统,要求报告是可读的PDF格式.我尝试了所有的免费库和应用程序,我发现唯一有效的是Adobe的acrobat家族.在 我用python编写了一个快速脚本,它使用win32ap ...

  3. python编写一个登陆验证程序_python项目实战:实现验证码登录网址实例

    前言 相信大家都明白,大多数的网站为了不被恶意访问,往往需要设置验证码登录,避免机器人访问,而造成我服务器瘫痪,崩溃,这里用到Python3,主要用到的包是re urllib.request http ...

  4. python编写一个登陆验证程序_Python实现简单登录验证详解

    本文实例为大家分享了简单的Python登录验证,供大家参考,具体内容如下 编写登录接口 要求:1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 #coding=utf-8 __aut ...

  5. python编写一个登陆验证程序,python自动化实现验证码登录过程

    (自动化实现验证码登录,这里内容是入坑后,整合了几个文档的内容)| 以下模块是使用时需要用到的 首先:安装pillow库,它的作用是对图片进行简单的处理,在pytharm中使用pip install ...

  6. python汉诺塔运行程序_用python编写一个程序,得到汉诺塔的解决方案

    古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示. 有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个座上的盘 ...

  7. 用python编写一个点餐程序_用python做一个点餐系统,热敏打印机怎么连?

    做一个局域网内的点餐系统 一台服务器(启动点餐系统的),一台路由器,一台平板电脑,一个热敏打印机. 流程是:服务器启动点餐系统,服务器连着路由器Wi-Fi,平板电脑连着路由器Wi-Fi,那么平板电脑通 ...

  8. 用python编写杨辉三角金字塔_用python实现三道简单算法题:杨辉三角,蛇形矩阵,金字塔...

    分享几道简单的python打印输出的问题,本质上都是可以将其分解成一个大循环之中有几个小循环. 1.杨辉三角 主要特点: 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 每行端点与结 ...

  9. python编写的动物识别专家系统_基于Python的动物识别专家系统

    1. 利用pyqt5来设计专家系统的界面. 如下图一: 图一 起始界面 相应的运行过程的界面,如图二: 图二 相应的运行过程界面 2. 设置规则文本 guizhe.txt 有毛发 哺乳动物 有奶 哺乳 ...

最新文章

  1. 服务器拒绝连接(The remote system refused the connection.)
  2. U-Boot移植教程之二:移植
  3. ML:分类预测问题中评价指标(ER/混淆矩阵P-R-F1/ROC-AUC/RP/mAP)简介、使用方法、代码实现、案例应用之详细攻略
  4. dwz ajax session超时跳转登录页(struts2自定义拦截器)
  5. Java Web开发小结
  6. python3.6 安装opencv_MacOS的Python3.6下安装OpenCV3.2.0
  7. ubuntu 添加用户、用户组
  8. java集合框架总结之思维导图
  9. Centos7下SRS流式服务器搭建、推流、拉流
  10. 坑爹的RegExp test()
  11. 动态 | AI能看懂英文,阿里巴巴夺实体发现测评全球第一
  12. linux内核移植imx8,iMX8模块Ubuntu移植
  13. thingjs这个3D js库怎么样?
  14. winhex改宽高和伪加密
  15. 计算机考研性价比低,关于计算机考研有什么性价比高的院校?一定要仔细看
  16. 科学计算与matlab语言期末答案,科学计算与MATLAB语言答案
  17. 华为机试题:【中级】报文转换
  18. SQL中的多表关联和子查询
  19. XML是什么,它可以做什么?——写给XML入门者
  20. WIN10没有按快捷键,突然弹出touchpad driver diagnostics

热门文章

  1. 杭电1492 The number of divisors(约数) about Humble Numbers
  2. mysql 表字段部分替换
  3. python编程(pyautogui库)
  4. android 获取linux线程状态,Android 的进程与线程总结
  5. python网页提交表单_Html表单——使用python在web页面上显示用户提交的数据
  6. edui 富文本编辑_React中使用UEditor百度富文本的方法
  7. 《计算机科学导论》百度云,【麻省理工学院】Python编程和计算机科学导论公开课(中英字幕)...
  8. angular1.x 组件开发
  9. Linq 使用skip和take分页
  10. button上传替换file上传按钮,并显示图片缩略图,纯jsp操作