django-生成随机验证码
Posted 一只丶顽皮猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django-生成随机验证码相关的知识,希望对你有一定的参考价值。
Python生成随机验证码,需要使用PIL模块.
安装:
pip3 install pillow
1
1
pip3 install pillow
基本使用
1.创建图片
from PIL import Image #导入模块
img=Image.new(mode="RGB",size=(120,40),color="yellow")
f=open("validCode.png","wb")
img.save(f,"png")
with open("validCode.png","rb") as f:
data=f.read()
return HttpResponse(data)
7
1
from PIL import Image #导入模块
2
img=Image.new(mode="RGB",size=(120,40),color="yellow")
3
f=open("validCode.png","wb")
4
img.save(f,"png")
5
with open("validCode.png","rb") as f:
6
data=f.read()
7
return HttpResponse(data)
2. 创建画笔,用于在图片上画任意内容
img = Image.new(mode=\'RGB\', size=(120, 30), color=(255, 255, 255))
1
1
img = Image.new(mode=\'RGB\', size=(120, 30), color=(255, 255, 255))
3.画点
img=Image.new(mode="RGB",size=(120,40),color="yellow")
draw=ImageDraw.Draw(img,mode=\'RGB\')
draw.point([100,100],fill=255,255,255)
#第一个参数:表示坐标
#第二个参数:表示颜色
5
1
img=Image.new(mode="RGB",size=(120,40),color="yellow")
2
draw=ImageDraw.Draw(img,mode=\'RGB\')
3
draw.point([100,100],fill=255,255,255)
4
#第一个参数:表示坐标
5
#第二个参数:表示颜色
4.画线
draw.line((100,100,300,100), fill=(255, 255, 255))
#第一个表示起始坐标和结束坐标
#第二个参数:表示颜色
3
1
draw.line((100,100,300,100), fill=(255, 255, 255))
2
#第一个表示起始坐标和结束坐标
3
#第二个参数:表示颜色
5. 画圆
img = Image.new(mode=\'RGB\', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode=\'RGB\')
draw.arc((100,100,300,300),0,90,fill="red")
# 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
# 第二个参数:表示开始角度
# 第三个参数:表示结束角度
# 第四个参数:表示颜色
8
1
img = Image.new(mode=\'RGB\', size=(120, 30), color=(255, 255, 255))
2
draw = ImageDraw.Draw(img, mode=\'RGB\')
3
4
draw.arc((100,100,300,300),0,90,fill="red")
5
# 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
6
# 第二个参数:表示开始角度
7
# 第三个参数:表示结束角度
8
# 第四个参数:表示颜色
6. 写文本 text
draw.text([0,0],\'python\',"red")
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
4
1
draw.text([0,0],\'python\',"red")
2
# 第一个参数:表示起始坐标
3
# 第二个参数:表示写入内容
4
# 第三个参数:表示颜色
1
1
验证码的几种使用方式
#方式一
#通过静态文件的目录来定位路径
import os
path = os.path.join(settings.BASE_DIR,"static","img","ss.jpg") #BASE_DIR表示settings的上一级目录的上一级目录
with open(path,"rb") as f:
data=f.read()
#方式二
from PIL import Image #导入PIL模块
img=Image.new(mode="RGB",size=(120,40),color="yellow") #创建画笔
f=open("validCode.png","wb") #保存在本地
img.save(f,"png")
with open("validCode.png","rb") as f: #进行读取
data=f.read()
return HttpResponse(data) #然后返回给前端
\'\'\'
缺点:
会在服务端的根目录下产生一个文件,我们不应该让它产生文件
\'\'\'
#方式三
\'\'\'
把文件读到内存中去
\'\'\'
from io import BytesIO
from PIL import Image
img=Image.new(mode="RGB",size=(120,40),color="blue")
f=BytesIO()
img.save(f,"png")
data=f.getvalue()
return HttpResponse(data)
#方式四
\'\'\'
随机产生验证码
\'\'\'
# def text(self, xy, text, fill=None, font=None, anchor=None,*args, **kwargs):
from io import BytesIO #把内容保存到内存中
import random
from PIL import Image,ImageDraw,ImageFont #导入图画,画笔,字体
img = Image.new(mode="RGB", size=(120, 40), color=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
draw=ImageDraw.Draw(img,"RGB")
font=ImageFont.truetype("blog/static/font/kumo.ttf",25)
def fandomColor():
\'\'\'
生成随机颜色
:return:
\'\'\'
random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
valid_list=[]
for i in range(5):
random_num=str(random.randint(0,9))
random_lower_zimu=chr(random.randint(65,90))
random_upper_zimu=chr(random.randint(97,122))
random_char=random.choice([random_num,random_lower_zimu,random_upper_zimu])
draw.text([5+i*24,10],random_char,(fandomColor()),font=font)
valid_list.append(random_char)
for i in range(100):
draw.point([random.randint(0, 5+i*24), random.randint(0,5+i*24 )], fill=fandomColor())
f=BytesIO()
img.save(f,"png")
data=f.getvalue()
valid_str="".join(valid_list)
print(valid_str)
request.session["keepValidCode"]=valid_str
return HttpResponse(data)
x
1
#方式一
2
#通过静态文件的目录来定位路径
3
import os
4
path = os.path.join(settings.BASE_DIR,"static","img","ss.jpg") #BASE_DIR表示settings的上一级目录的上一级目录
5
with open(path,"rb") as f:
6
data=f.read()
7
8
9
10
#方式二
11
from PIL import Image #导入PIL模块
12
img=Image.new(mode="RGB",size=(120,40),color="yellow") #创建画笔
13
f=open("validCode.png","wb") #保存在本地
14
img.save(f,"png")
15
with open("validCode.png","rb") as f: #进行读取
16
data=f.read()
17
return HttpResponse(data) #然后返回给前端
18
\'\'\'
19
缺点:
20
会在服务端的根目录下产生一个文件,我们不应该让它产生文件
21
\'\'\'
22
#方式三
23
\'\'\'
24
把文件读到内存中去
25
\'\'\'
26
from io import BytesIO
27
from PIL import Image
28
img=Image.new(mode="RGB",size=(120,40),color="blue")
29
f=BytesIO()
30
img.save(f,"png")
31
data=f.getvalue()
32
return HttpResponse(data)
33
34
35
36
#方式四
37
\'\'\'
38
随机产生验证码
39
\'\'\'
40
# def text(self, xy, text, fill=None, font=None, anchor=None,*args, **kwargs):
41
42
from io import BytesIO #把内容保存到内存中
43
import random
44
45
from PIL import Image,ImageDraw,ImageFont #导入图画,画笔,字体
46
img = Image.new(mode="RGB", size=(120, 40), color=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
47
48
draw=ImageDraw.Draw(img,"RGB")
49
font=ImageFont.truetype("blog/static/font/kumo.ttf",25)
50
def fandomColor():
51
\'\'\'
52
生成随机颜色
以上是关于django-生成随机验证码的主要内容,如果未能解决你的问题,请参考以下文章