验证码制作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#string模块自带数字、字母、特殊字符变量集合,不需要我们手写集合 import string import random import os import uuid import settings class Code( object ): # 生成随机生成数字或字母 def random_hexdigits( self , len = 1 ): return random.sample(string.hexdigits, len ) # 生成干扰字符 def punctuation( self , len = 1 ): return tuple (random.sample(string.punctuation, len )) # 定义干扰字符颜色 def random_color( self , min = 64 , max = 255 ): return tuple ((random.randint( min , max ) for i in range ( 3 ))) # 生成验证码 def creat_code( self , width = 80 , height = 24 , color = ( 192 , 192 , 192 )): image = Image.new( 'RGB' , (width, height), color) #建议下载几款字体,变换下风格,我在setting粒定义了static路径,这里就直接导入了 font = ImageFont.truetype(os.path.join(settings.STATICPATH, 'fonts/Lora-Regular.ttf' ), 20 ) draw = ImageDraw.Draw(image) self .fill_color(draw, image, 5 ) self .fill_dischar(draw, image, 10 ) code = self .fill_char(draw, image, 4 , 10 , font) image_name = '{}.jpeg' . format (uuid.uuid4(). hex ) image_path = os.path.join(settings.STATICPATH, 'code/{}' . format (image_name)) print (image_path) image.save(image_path) return { 'code' : code, 'image_path' : image_path} # 填充颜色 def fill_color( self , draw, image, interval): for i in range ( 0 , image.width, interval): for j in range ( 0 , image.height, interval): draw.point((i, j), fill = self .random_color()) # 填充验证码 def fill_dischar( self , draw, image, interval): for i in range ( 0 , image.width, interval): dis = self .punctuation() j = random.randrange( 3 , image.height - 3 ) draw.text((i, j), dis[ 0 ], fill = self .random_color( 64 , 255 )) # 填充验证码 def fill_char( self , draw, image, num, interval, font): code = '' for i in range (num): cha = self .random_hexdigits() code + = str (cha[ 0 ]) j = random.randrange( 0 , 5 ) # print(cha) # print(image.width*(i/num)+interval,j) draw.text((image.width * (i / num) + interval, j), cha[ 0 ], fill = self .random_color( 32 , 127 ), font = font) return code if __name__ = = "__main__" : code = Code() print (code.creat_code()) |
flask路由配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import os from flask import Flask, Response from flask import render_template from utils.code import Code app = Flask(__name__) @app .route( '/' ) def Register(): return render_template( 'verify.html' ) @app .route( '/codes/' ) def code(): infor = Code().creat_code() image_path = infor[ "image_path" ] code = infor[ 'code' ] print (image_path) with open (image_path, 'rb' ) as f: image_content = f.read() os.remove(image_path) return Response(image_content, mimetype = 'jpeg' ) if __name__ = = '__main__' : app.run(debug = True ) |
前端配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
< div class = 'form-row' > < form id = "email_register_form" method = "post" autocomplete = "off" > < div class = "form-group " > < label >邮 箱</ label > < input type = "text" id = "id_email" name = "email" value = "None" placeholder = "请输入您的邮箱地址" /> </ div > < div class = "form-group " > < label >密 码</ label > < input type = "password" id = "id_password" name = "password" value = "None" placeholder = "请输入6-20位非中文字符密码" /> </ div > < div class = "form-group captcha1 " > < label >验 证 码</ label > < img src = "/codes/" alt = "captcha" title = "点击切换" class = "captcha" onclick = "this.src='codes/?'+Math.random()" /> < input autocomplete = "off" id = "id_captcha_1" name = "captcha_1" height = "30px" type = "text" > </ div > < input class = "btn btn-green" id = "jsEmailRegBtn" type = "submit" value = "注册" /> </ form > |
源码分享:https://github.com/geekdick/pythonDemo/tree/master/verify
原文链接:https://segmentfault.com/a/1190000013739881