Python生成随机验证码,需要使用PIL模块.
安装:
  1. pip3 install pillow
1
 
1
  1. pip3 install pillow

基本使用

1.创建图片
  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)
7
 
1
  1. from PIL import Image            #导入模块
2
  1. img=Image.new(mode="RGB",size=(120,40),color="yellow")
3
  1. f=open("validCode.png","wb")
4
  1. img.save(f,"png")
5
  1. with open("validCode.png","rb") as f:
6
  1.     data=f.read()
7
  1. return HttpResponse(data)
2. 创建画笔,用于在图片上画任意内容
  1. img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
1
 
1
  1. img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
3.画点
  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. #第二个参数:表示颜色
5
 
1
  1. img=Image.new(mode="RGB",size=(120,40),color="yellow")
2
  1. draw=ImageDraw.Draw(img,mode='RGB')
3
  1. draw.point([100,100],fill=255,255,255)
4
  1. #第一个参数:表示坐标
5
  1. #第二个参数:表示颜色
4.画线
  1. draw.line((100,100,300,100), fill=(255, 255, 255))
  2. #第一个表示起始坐标和结束坐标
  3. #第二个参数:表示颜色
3
 
1
  1. draw.line((100,100,300,100), fill=(255, 255, 255))
2
  1. #第一个表示起始坐标和结束坐标
3
  1. #第二个参数:表示颜色
5. 画圆
  1. img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
  2. draw = ImageDraw.Draw(img, mode='RGB')
  3. draw.arc((100,100,300,300),0,90,fill="red")
  4. # 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
  5. # 第二个参数:表示开始角度
  6. # 第三个参数:表示结束角度
  7. # 第四个参数:表示颜色
8
 
1
  1. img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
2
  1. draw = ImageDraw.Draw(img, mode='RGB')
3
  1.  
4
  1. draw.arc((100,100,300,300),0,90,fill="red")
5
  1. # 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
6
  1. # 第二个参数:表示开始角度
7
  1. # 第三个参数:表示结束角度
8
  1. # 第四个参数:表示颜色
6. 写文本 text
  1. draw.text([0,0],'python',"red")
  2. # 第一个参数:表示起始坐标
  3. # 第二个参数:表示写入内容
  4. # 第三个参数:表示颜色
4
 
1
  1. draw.text([0,0],'python',"red")
2
  1. # 第一个参数:表示起始坐标
3
  1. # 第二个参数:表示写入内容
4
  1. # 第三个参数:表示颜色





1
 
1
  1.  

验证码的几种使用方式

  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. from PIL import Image #导入PIL模块
  9. img=Image.new(mode="RGB",size=(120,40),color="yellow") #创建画笔
  10. f=open("validCode.png","wb") #保存在本地
  11. img.save(f,"png")
  12. with open("validCode.png","rb") as f: #进行读取
  13. data=f.read()
  14. return HttpResponse(data) #然后返回给前端
  15. '''
  16. 缺点:
  17. 会在服务端的根目录下产生一个文件,我们不应该让它产生文件
  18. '''
  19. #方式三
  20. '''
  21. 把文件读到内存中去
  22. '''
  23. from io import BytesIO
  24. from PIL import Image
  25. img=Image.new(mode="RGB",size=(120,40),color="blue")
  26. f=BytesIO()
  27. img.save(f,"png")
  28. data=f.getvalue()
  29. return HttpResponse(data)
  30. #方式四
  31. '''
  32. 随机产生验证码
  33. '''
  34. # def text(self, xy, text, fill=None, font=None, anchor=None,*args, **kwargs):
  35. from io import BytesIO #把内容保存到内存中
  36. import random
  37. from PIL import Image,ImageDraw,ImageFont #导入图画,画笔,字体
  38. img = Image.new(mode="RGB", size=(120, 40), color=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
  39. draw=ImageDraw.Draw(img,"RGB")
  40. font=ImageFont.truetype("blog/static/font/kumo.ttf",25)
  41. def fandomColor():
  42. '''
  43. 生成随机颜色
  44. :return:
  45. '''
  46. random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
  47. valid_list=[]
  48. for i in range(5):
  49. random_num=str(random.randint(0,9))
  50. random_lower_zimu=chr(random.randint(65,90))
  51. random_upper_zimu=chr(random.randint(97,122))
  52. random_char=random.choice([random_num,random_lower_zimu,random_upper_zimu])
  53. draw.text([5+i*24,10],random_char,(fandomColor()),font=font)
  54. valid_list.append(random_char)
  55. for i in range(100):
  56. draw.point([random.randint(0, 5+i*24), random.randint(0,5+i*24 )], fill=fandomColor())
  57. f=BytesIO()
  58. img.save(f,"png")
  59. data=f.getvalue()
  60. valid_str="".join(valid_list)
  61. print(valid_str)
  62. request.session["keepValidCode"]=valid_str
  63. return HttpResponse(data)
x
 
1
  1. #方式一
2
  1.    #通过静态文件的目录来定位路径
3
  1.    import os
4
  1.    path = os.path.join(settings.BASE_DIR,"static","img","ss.jpg")  #BASE_DIR表示settings的上一级目录的上一级目录
5
  1.    with open(path,"rb") as f:
6
  1.        data=f.read()
7
  1.  
8
  1.  
9
  1.  
10
  1. #方式二
11
  1.    from PIL import Image         #导入PIL模块
12
  1.    img=Image.new(mode="RGB",size=(120,40),color="yellow")   #创建画笔
13
  1.    f=open("validCode.png","wb")                     #保存在本地
14
  1.    img.save(f,"png")
15
  1.    with open("validCode.png","rb") as f:            #进行读取
16
  1.        data=f.read()            
17
  1.    return HttpResponse(data)                        #然后返回给前端
18
  1. '''
19
  1. 缺点:
20
  1.   会在服务端的根目录下产生一个文件,我们不应该让它产生文件
21
  1. '''
22
  1. #方式三  
23
  1. '''
24
  1. 把文件读到内存中去
25
  1. '''
26
  1.    from io import BytesIO    
27
  1.    from PIL import Image
28
  1.    img=Image.new(mode="RGB",size=(120,40),color="blue")
29
  1.    f=BytesIO()
30
  1.    img.save(f,"png")
31
  1.    data=f.getvalue()
32
  1.    return HttpResponse(data)
33
  1.  
34
  1.  
35
  1.  
36
  1. #方式四
37
  1. '''
38
  1. 随机产生验证码
39
  1. '''
40
  1. #       def text(self, xy, text, fill=None, font=None, anchor=None,*args, **kwargs):
41
  1.  
42
  1. from io import BytesIO                 #把内容保存到内存中
43
  1. import random              
44
  1.  
45
  1.    from PIL import Image,ImageDraw,ImageFont      #导入图画,画笔,字体
46
  1.    img = Image.new(mode="RGB", size=(120, 40), color=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
47
  1.  
48
  1.    draw=ImageDraw.Draw(img,"RGB")
49
  1.    font=ImageFont.truetype("blog/static/font/kumo.ttf",25)
50
  1.    def fandomColor():
51
  1.        '''
52
  1.       生成随机颜色
53
  1.       :return:
54
  1.       '''
55
  1.        random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
56
  1.    valid_list=[]
57
  1.    for i in range(5):
58
  1.  
59
  1.        random_num=str(random.randint(0,9))
60
  1.        random_lower_zimu=chr(random.randint(65,90))
61
  1.        random_upper_zimu=chr(random.randint(97,122))
62
  1.  
63
  1.        random_char=random.choice([random_num,random_lower_zimu,random_upper_zimu])
64
  1.        draw.text([5+i*24,10],random_char,(fandomColor()),font=font)
65
  1.        valid_list.append(random_char)
66
  1.  
67
  1.    for i in range(100):
68
  1.        draw.point([random.randint(0, 5+i*24), random.randint(0,5+i*24 )], fill=fandomColor())
69
  1.    f=BytesIO()
70
  1.    img.save(f,"png")
71
  1.    data=f.getvalue()
72
  1.  
73
  1.    valid_str="".join(valid_list)
74
  1.    print(valid_str)
75
  1.  
76
  1.    request.session["keepValidCode"]=valid_str
77
  1.  
78
  1.    return HttpResponse(data)
79
  1.  
80
  1.  
81
  1.  
82
  1.    
83
  1.  

验证码的局部刷新

当有时验证码看不太清时,需要进行验证码的刷新,可以在img中src的路径中加上1个>相当于对服务器发起一次请求

示例代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
  7. <script src="/static/jquery-3.2.1.js"></script>
  8. <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
  9. </head>
  10. <body>
  11. <form class="form-horizontal">
  12. {% csrf_token %}
  13. <div class="form-group">
  14. <label for="username" class="col-sm-2 control-label">用户名</label>
  15. <div class="col-sm-4">
  16. <input type="text" class="form-control" id="username" placeholder="用户名">
  17. </div>
  18. </div>
  19. <div class="form-group">
  20. <label for="inputPassword3" class="col-sm-2 control-label">Password</label>
  21. <div class="col-sm-4">
  22. <input type="password" class="form-control" id="password" placeholder="Password">
  23. </div>
  24. </div>
  25. <div class="form-group">
  26. <label for="validCode" class="col-sm-2 control-label">验证码</label>
  27. <div class="col-sm-4">
  28. <input type="text" class="form-control" id="validCode" placeholder="验证码">
  29. <img src="/get_verification_img/" alt="" class="valid_code_img" >
  30. <a class="refresh">刷新</a>
  31. </div>
  32. </div>
  33. <div class="form-group">
  34. <div class="col-sm-offset-2 col-sm-10">
  35. <button type="submit" class="btn btn-default signlogin">Sign in</button>
  36. </div>
  37. <div class="col-sm-offset-2 col-sm-10">
  38. </div>
  39. </div>
  40. </form>
  41. <script>
  42. $(".refresh").click(function () {
  43. $(".valid_code_img")[0].src+="?";
  44. });
  45. $("img").click(function () {
  46. $(this)[0].src+="?";
  47. });
  48. </script>
  1. x
50
 
1
  1. <!DOCTYPE html>
2
  1. <html lang="en">
3
  1. <head>
4
  1.    <meta charset="UTF-8">
5
  1.    <title>Title</title>
6
  1.    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
7
  1.    <script src="/static/jquery-3.2.1.js"></script>
8
  1.    <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
9
  1. </head>
10
  1. <body>
11
  1. <form class="form-horizontal">
12
  1.   {% csrf_token %}
13
  1.  <div class="form-group">
14
  1.    <label for="username" class="col-sm-2 control-label">用户名</label>
15
  1.    <div class="col-sm-4">
16
  1.      <input type="text" class="form-control" id="username" placeholder="用户名">
17
  1.    </div>
18
  1.  </div>
19
  1.  <div class="form-group">
20
  1.    <label for="inputPassword3" class="col-sm-2 control-label">Password</label>
21
  1.    <div class="col-sm-4">
22
  1.      <input type="password" class="form-control" id="password" placeholder="Password">
23
  1.    </div>
24
  1.  </div>
25
  1.      <div class="form-group">
26
  1.    <label for="validCode" class="col-sm-2 control-label">验证码</label>
27
  1.    <div class="col-sm-4">
28
  1.      <input type="text" class="form-control" id="validCode" placeholder="验证码">
29
  1.      <img src="/get_verification_img/" alt="" class="valid_code_img" >
30
  1.        <a class="refresh">刷新</a>
31
  1.    </div>
32
  1.  </div>
33
  1.  <div class="form-group">
34
  1.    <div class="col-sm-offset-2 col-sm-10">
35
  1.      <button type="submit" class="btn btn-default signlogin">Sign in</button>
36
  1.    </div>
37
  1.        <div class="col-sm-offset-2 col-sm-10">
38
  1.  
39
  1.    </div>
40
  1.  </div>
41
  1.  
42
  1. </form>
43
  1.  
44
  1. <script>
45
  1.    $(".refresh").click(function () {
46
  1.        $(".valid_code_img")[0].src+="?";
47
  1.   });
48
  1.    $("img").click(function () {
49
  1.        $(this)[0].src+="?";
50
  1.   });
51
  1. </script>





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

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

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

  2. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  3. Python 生成随机验证码

    Python生成随机验证码  Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...

  4. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  5. Python使用PIL模块生成随机验证码

    PIL模块的安装 pip3 install pillow 生成随机验证码图片 import random from PIL import Image, ImageDraw, ImageFont fro ...

  6. C#生成随机验证码例子

    C#生成随机验证码例子: 前端: <tr> <td width=" align="center" valign="top"> ...

  7. pillow实例 | 生成随机验证码

    1 PIL(Python Image Library) PIL是Python进行基本图片处理的package,囊括了诸如图片的剪裁.缩放.写入文字等功能.现在,我便以生成随机验证码为例,讲述PIL的基 ...

  8. struts2生成随机验证码图片

    之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...

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

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

  10. C#生成随机验证码

    使用YZMHelper帮助类即可 using System; using System.Web; using System.Drawing; using System.Security.Cryptog ...

随机推荐

  1. [kfaka] Apache Kafka:下一代分布式消息系统

    简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...

  2. [转]ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  3. ASP------字符串与HTML格式相互转换

    代码: 1.字符串转HTML HttpUtility.HtmlDecode(" is ") 或者 Server.UrlDecode(" is ") 2.HTML ...

  4. Extjs学习笔记--(二)

    1.配置实用Extjs <link href="Extjs/resources/css/ext-all.css" rel="stylesheet" /&g ...

  5. 什么是“类数组对象”,在jquer中怎样将类数组对象转换为数组对象

    类数组对象的定义: 所谓"类数组对象"就是一个常规的Object对象,如$("div")但它和数组对象非常相似:具备length属性, 并以0.1.2.3……等 ...

  6. jQuery中的$.each的用法

    $.each(Array,function(i,value){ this;  //this指向当前对象 i;       //i表示当前下标 value; //value表示当前元素 })

  7. 谈一谈php://input和php://output

    对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述. php://input 是个可以访问请求的原始数据的只读流. POST 请求的情况下,最好使用 php://inpu ...

  8. 【Mysql】大数据处理优化方法

    1.应尽量避免在 where 子句中使用 != 或  <>  操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orde ...

  9. sql数据库中如何根据身份证号判断性别

    身份证号有15位和18位的..在sql中该如何判断? I_sex ,) ,) then '男' else '女' END

  10. 1.执行环境判断 window 或 self

    window or self ? 在 underscore 的判断所处环境的代码中,似乎我们没有看到 window 对象的引用,其实,在浏览器环境下,self 保存的就是当前 window 对象的引用 ...