django + PIL 生成网页动态验证码
Posted python自动化运维之美
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django + PIL 生成网页动态验证码相关的知识,希望对你有一定的参考价值。
众所周知,一般正常的对外服务网站都有几个基本的功能就是验证码,验证码的重要性,这里就不多说了。主要是防止恶意破解密码,论坛灌水等等功能,
制作网站验证码必须要尊重一点,就是复杂但不要过度影响用户体验,这里就不得不吐槽一下12306的神级验证码了。博主每次刷票没有个5,6次都不可能选对的。这种就有点严重影响用户体验了。
说回整体,本节我们简单介绍一下django验证码的制作方法
技术点
其实django的第三方模块中有关于验证码的模块,django-simple-captcha,说实话不太好用切复杂。有兴趣的同学可以自行了解或在评论区留言。
这里咱们主要通过PIL来生成验证码的图片,利用传统的session方式来进行保存。(不要告诉我你不知道PIL是什么,百度去!)
环境描述
本节使用的是python2.7+ django1.8.3+PIL(Pillow 4.0.0)进行讲解,代码也是亲自验证可用的。具体模块安装不讲解,都比较简单 pip安装即可
开始
首先创建django项目。编写第一个模块,处理图片模块
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random,string
from PIL import Image,ImageDraw,ImageFont,ImageFilter
#生成随机字符串
def getRandomChar():
#string模块包含各种字符串,以下为小写字母加数字
ran = string.ascii_lowercase+string.digits
char = ''
for i in range(4):
char += random.choice(ran)
return char
#返回一个随机的RGB颜色
def getRandomColor():
return (random.randint(50,300),random.randint(50,150),random.randint(50,150))
def create_code():
#创建图片,模式,大小,背景色
img = Image.new('RGB', (120,30), (255,255,255))
#创建画布
draw = ImageDraw.Draw(img)
#设置字体
font = ImageFont.truetype('E:\PycharmProjects\untitled1\dsaf\Arial.ttf', 25)
code = getRandomChar()
#将生成的字符画在画布上
for t in range(4):
draw.text((30*t+5,0),code[t],getRandomColor(),font)
#生成干扰点
for _ in range(random.randint(0,500)):
#位置,颜色
draw.point((random.randint(0, 120), random.randint(0, 30)),fill=getRandomColor())
#生成干扰线
line_num = random.randint(1,5) # 干扰线条数
for i in range(line_num):
# 起始点
begin = (random.randint(0, 120), random.randint(0, 30))
# 结束点
end = (random.randint(0, 120), random.randint(0, 30))
draw.line([begin, end], fill=(0, 0, 0))
#使用模糊滤镜使图片模糊
# img = img.filter(ImageFilter.BLUR) ##这里为什么#上了呢,博主发现这个模糊有点过了 导致图片太不清晰。各位老铁可以实际写一下体验一下
#保存
# img.save(''.join(code)+'.jpg','jpeg')
return img,code
if __name__ == '__main__':
create_code()
以上代码我们保存为check_code.py 放在views.py 同级,或者你自己定义位置。
这里注意上面代码使用到了Arial.ttf 字体文件,这个需要自行下载并写上绝对目录,否则生成时会报错。。
接下来编写views.py
```python
!/usr/bin/env python
-- coding:utf-8 --
import check_code
from io import BytesIO
from django.http import HttpResponse
def create_code_img(request):
#在内存中开辟空间用以生成临时的图片
f = BytesIO()
img,code = check_code.create_code()
request.session['check_code'] = code
img.save(f,'PNG')
return HttpResponse(f.getvalue())
from django.shortcuts import render_to_response,render
def test_code(request):
#GET方法返回表单
if request.method == 'GET':
return render(request,'index.html')
#POST方法用来验证提交的验证码是否正确
else:
code = request.POST.get('code','')
if code == request.session.get('check_code','error'):
return HttpResponse("yes")
return HttpResponse("no")
##### 然后咱们写个简单的页面 注意上面的代码 咱们命名为index.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>验证码登录</title>
</head>
<body>
<form method="post" action="#">
{% csrf_token %}
<img id="check_code_img" onclick="refresh_check_code(this)">
<input type="text" name="code">
<input type="submit">
</form>
<script>
function refresh_check_code(ths) {
ths.src += '?';
//点击图片刷新功能
}
</script>
</body>
</html>
然后设置url 编辑urls.py
from dsaf import views
urlpatterns = [
url(r'^create_code/$',views.create_code_img),
url(r'^index/',views.test_code),
]
ok 代码编写部分基本完成。由于以上代码使用到了session ,所以要生成一下django的数据库
python manage.py makemigrations
python manage.py migrate
执行上面两条指令即可
全部搞定,咱们启动测试一下。
python manage.py runserver 0.0.0.0:8080
浏览器访问一下 http://127.0.0.1:8000/index/ 不出意外的话你将看到如下界面。
怎么样,如果你跟着本教程一起写是否看到了验证码界面呢。
bingo 本次讲解到这里就完成啦,欢迎在评论区留言互动。
学无止境,同志们仍需努力。最重要的一点是学习python 要多写而不是一味的看!!
欢迎点击【阅读原文】访问魏先森个人独立博客,查看更多python教程
以上是关于django + PIL 生成网页动态验证码的主要内容,如果未能解决你的问题,请参考以下文章