Django - 验证码

作用

  • 在注册、登陆页面为了防止暴力请求,可以加入验证码功能,如果验证错误,则不需要继续处理,可以减轻服务器和数据库的压力。
  • 也是一种有效的防止 csrf 的方法。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆</title>
</head>
<body>
<form action="/login/" method="POST">
{% csrf_token %}
账号:<input type="text" value="" name="username"/><br/>
密码:<input type="password" value="" name="passwd"/><br/>
验证码:<input type="text" name="verifycode" value=""/><img src="http://127.0.0.1:8000/verifycode/">
<hr/>
<input type="submit" value="登陆"/>
</form>
</body>
</html>
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
68
69
70
71
72
73
74
def verifycode(request):
# 引入绘图模块
from PIL import Image, ImageDraw, ImageFont
# 引入随机函数模块
import random
# 定义变量,用于画面的背景色、宽、高
bgcolor = (random.randrange(20, 100), random.randrange(
20, 100), random.randrange(20, 100))
width = 100
height = 50
# 创建画面对象
im = Image.new('RGB', (width, height), bgcolor)
# 创建画笔对象
draw = ImageDraw.Draw(im)
# 调用画笔的point()函数绘制噪点
for i in range(0, 100):
xy = (random.randrange(0, width), random.randrange(0, height))
fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
draw.point(xy, fill=fill)
# 定义验证码的备选值
str = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
# 随机选取4个值作为验证码
rand_str = ''
for i in range(0, 4):
rand_str += str[random.randrange(0, len(str))]
# 构造字体对象
font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', 40)
# 构造字体颜色
fontcolor1 = (255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor2 = (255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor3 = (255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor4 = (255, random.randrange(0, 255), random.randrange(0, 255))
# 绘制4个字
draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1)
draw.text((25, 2), rand_str[1], font=font, fill=fontcolor2)
draw.text((50, 2), rand_str[2], font=font, fill=fontcolor3)
draw.text((75, 2), rand_str[3], font=font, fill=fontcolor4)
# 释放画笔
del draw
# 内存文件操作
import io
buf = io.BytesIO()
# 将图片保存在内存中,文件类型为png
im.save(buf, 'png')
# 将内存中的图片数据返回给客户端,MIME类型为图片png
response = HttpResponse(buf.getvalue(), 'image/png')

# 存入session,用于做进一步验证
request.session['verifycode'] = rand_str

# 让客户端验证验证码是否正确
# response.set_cookie('verifycode', rand_str)

return response


def login(request):
if request.method == "GET":
return render(request, 'myApp/login.html')
else:
verifycode = request.POST.get("verifycode")

if verifycode.upper() == request.session.get("verifycode").upper():
# 验证码验证成功
# 验证用户名与密码
if request.POST.get("username") == "sunck" and request.POST.get("passwd") == "123qweasdzxc":
# 用户验证成功
return redirect("/")
else:
# 用户验证失败
return redirect("/login/")
else:
# 验证码验证失败
return redirect("/login/")
------------- 本文结束 感谢您的阅读 -------------
正在加载今日诗词....