Python生成随机验证码,需要使用PIL模块.

安装:

1
python3.5 -m pip install pillow

基本使用

1. 创建图片

1
2
3
4
5
6
7
8
9
from PIL import Image
img = Image.new(mode='RGB', size=(12030), color=(255255255))
  
# 在图片查看器中打开
# img.show()
  
# 保存在本地
with open('code.png','wb') as f:
    img.save(f,format='png')

2. 创建画笔,用于在图片上画任意内容

1
2
img = Image.new(mode='RGB', size=(12030), color=(255255255))
draw = ImageDraw.Draw(img, mode='RGB')

3. 画点

1
2
3
4
5
6
img = Image.new(mode='RGB', size=(12030), color=(255255255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示坐标
# 第二个参数:表示颜色
draw.point([100100], fill="red")
draw.point([300300], fill=(255255255))

4. 画线

1
2
3
4
5
6
img = Image.new(mode='RGB', size=(12030), color=(255255255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标
# 第二个参数:表示颜色
draw.line((100,100,100,300), fill='red')
draw.line((100,100,300,100), fill=(255255255))

5. 画圆

1
2
3
4
5
6
7
img = Image.new(mode='RGB', size=(12030), color=(255255255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
# 第二个参数:表示开始角度
# 第三个参数:表示结束角度
# 第四个参数:表示颜色
draw.arc((100,100,300,300),0,90,fill="red")

6. 写文本

1
2
3
4
5
6
img = Image.new(mode='RGB', size=(12030), color=(255255255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
draw.text([0,0],'python',"red")

7. 特殊字体文字

1
2
3
4
5
6
7
8
9
10
img = Image.new(mode='RGB', size=(12030), color=(255255255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示字体文件路径
# 第二个参数:表示字体大小
font = ImageFont.truetype("kumo.ttf"28)
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
# 第四个参数:表示颜色
draw.text([00], 'python'"red", font=font)

图片验证码实例

路由URL
url(r'^get_valid_img/$', views.get_valid_img),
def get_valid_img(request):
'''
验证码获取
:param request:
:return:
'''
# 第一种方法,通过本地图片,传送返回
'''
import os
from Blogsys import settings
path = os.path.join(settings.BASE_DIR,'app01','static','img','default.png')
# 打开这个图片,用二进制读出来返回给IMAGE的SRC
f = open(path,'rb')
data = f.read()
return HttpResponse(data)

第一种固定图片

 # 第二钟方法,通过PIL模块创建这个图片
from PIL import Image
import random
# 获取背景颜色
def get_random_color():
return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
# 生成图片,第一个参数是模式,第二个是大小,第三个是背景色
image = Image.new(mode='RGB',size=(260,40),color=get_random_color()) # 创建一个有背景颜色的图片
f = open('default.png','wb') # 二进制打开一个本地文件
image.save(f,'png') # 将这个图片存放进去,第一个参数是本地文件的句柄,第二个参数是文件最后格式
# 读取图片,返回给IMAGE的SRC
with open('default.png','rb') as f_read:
data = f_read.read() # 第三种方法与第二种方法一样,只不过存出在内存
# from PIL import Image
# import random
# from io import BytesIO
# # 获取背景颜色
# def get_random_color():
# return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
#
# # 生成图片,第一个参数是模式,第二个是大小,第三个是背景色
# image = Image.new(mode='RGB', size=(260, 40), color=get_random_color()) # 创建一个有背景颜色的图片
# f = BytesIO() # 打开内存空间
# image.save(f, 'png') # 将这个图片存放进去,第一个参数是本地文件的句柄,第二个参数是文件最后格式
# data = f.getvalue() # 读取图片,返回给IMAGE的SRC,获取IO里面对象
# return HttpResponse(data) # 第四种方法,通过PIL模块,画板,画笔
from PIL import Image, ImageDraw, ImageFont
import random
from io import BytesIO if request.is_ajax() or request.method=='GET':def get_random_color():
'''
随机颜色函数
:return:
'''
return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_random_char():
'''
随机验证码函数
:return:
'''
random_num = str(random.randint(0, 9))
random_upper_alph = chr(random.randint(65, 90))
random_lower_alph = chr(random.randint(97, 122))
random_char = random.choice([random_num, random_lower_alph, random_upper_alph])
return random_char
image = Image.new(mode="RGB", size=(260, 40), color=get_random_color()) # 创建图片
draw = ImageDraw.Draw(image, mode='RGB') # 将图片弄成画板,要有图片,模式
font = ImageFont.truetype("app01/static/kumo.ttf", 32) # 创建个画笔,要有字体,大小
valid_code_str = "" # 随机验证码变量
for i in range(1, 6):
char = get_random_char() # 执行随机验证码函数
valid_code_str += char # 添加到随机验证码的变量
# 画板内容,X,Y,TEXT,COLOR,FONT
draw.text([i * 40, 5], char, get_random_color(), font=font)
print('我是验证码',valid_code_str)
# 噪点设计,比如点点,圈圈,横线 # width = 260
# height = 40
# for i in range(80): # 创建80个点点,五颜六色的点
# draw.point((random.randint(0,width),random.randint(0,height)),fill=get_random_color())
#
# for i in range(10):
# x1 = random.randint(0,width) # 创建十条线,五颜六色的线
# x2 = random.randint(0,width)
# y1 = random.randint(0,height)
# y2 = random.randint(0,height)
# draw.line((x1,y1,x2,y2),fill=get_random_color()) # for i in range(40): # 创建40个圈圈,但不是很理想,感觉跟点点差不多
# draw.point([random.randint(0,width),random.randint(0,height)],fill=get_random_color())
# x = random.randint(0,width)
# y = random.randint(0,height)
# draw.arc((x,y,x+90,y+90),0,90,fill=get_random_color()) # 通过这里控制坐标 f = BytesIO() # 打开内存空间
image.save(f,'png') # 保存到内存空间
data = f.getvalue() # 取出验证码,图片,样式返回 # 验证码生成了,这时候需要放在session里面,然后通过AJAX提交,后台判断是否匹配成功
request.session['valid_code_str'] = valid_code_str
return HttpResponse(data)
  <div class="col-md-6">{# src可以跟一个图片源,我们要通过模块来创建,也会走/get_valid_img/#}
<img src="/get_valid_img/" alt="验证码" id="valid_img" height="" width="">
</div>
 {#    方式一,刷新验证码,通过/get_valid_img/后面加入?刷新,不需要试图函数更改#} 随机验证码刷新
$("#valid_img").click(function () {
$(this)[0].src += "?"
});
如果需要验证码的验证,在views里面的验证码放在session里面,html里面记录用户输入验证码,再通过forms里钩子比对

django随机验证码的更多相关文章

  1. Django之路 - 实现登录随机验证码

    登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验 ...

  2. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  3. Django随机生成验证码图片

    PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...

  4. Django中生成随机验证码(pillow模块的使用)

    Django中生成随机验证码 1.html中a标签的设置 <img src="/get_validcode_img/" alt=""> 2.view ...

  5. Django之实现登录随机验证码

    登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验 ...

  6. Django框架登录验证及产生随机验证码的实例

    1:views视图代码 # 登录验证 def login(request): # 使用ajax请求可以使用判断 # if request.is_ajax(): if request.method == ...

  7. python模块之PIL模块(生成随机验证码图片)

    PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...

  8. django生成验证码

    django生成验证码 # 制作验证码 def verify_code(): # 1,定义变量,用于画面的背景色.宽.高 # random.randrange(20, 100)意思是在20到100之间 ...

  9. 7月2日 Django 生成验证码、

    html页面里 {# 验证码 #} <div class="form-group " id="v-code-wrapper"> <label ...

随机推荐

  1. 2017北京赛区H题

    题目链接 题意:在n*m的矩阵中选择变换或者不变换一个数变成p,使得最大子矩阵和最小 1<=n,m<=150, -1000<=p<=1000; 题解: 他人题解链接 涉及到知识 ...

  2. Mysql数据库的增删改查

    在运行程序之前需要在mysql数据库中创建test数据库,如下图所示: 下面是具体是实现程序: package News; import java.sql.Connection; import jav ...

  3. PostgreSQL copy命令使用记录

    上篇写到用pg_bulkload来导入数据,但是实际的环境是solaris,pg_bulkload还不支持,于是用copy的方式,下面附上脚本 -bash-4.1$ cat copy.sh #!/bi ...

  4. Android 代码实现viewPager+fragment 模仿今日头条的顶部导航

    模仿今日头条的顶部导航:    下载地址: http://download.csdn.net/detail/u014608640/9917700 效果图:

  5. 设计模式 - 代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  6. Goroutine是如何工作的?

    翻译原文链接 转帖/转载请注明出处英文原文链接 发表于2014/02/24 Go语言 如果你刚刚接触Go语言,或者说你并不理解“并发不等于并行”这句话的含义,那么Rob Pike的讲座值得一看(在yo ...

  7. learn go anonymous function

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.8.md im ...

  8. Git详解之十 Git常用命令

    下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一. ...

  9. JVM原理三-----GC模块,垃圾回收

    GC方法:在JVM启动时填入参数(比如:-XX:+UseConcMarkSweepGC ) 算法区分: 1.古老回收算法: Reference Counting  ,对象有一个引用,即增加一个计数,删 ...

  10. z=sin(xy)

    看了<千年难题>,第一章是黎曼猜想.里面有两个我很感兴趣的问题:一是关于函数的图形表示方式,比如z=sin(xy)的图像,二是大数的因子分解方式. 专业的数学软件应该能够很容易的生成各种函 ...