一般正常的对外服务网站都有几个基本的功能就是验证码,验证码的重要性,这里就不多说了。主要是防止恶意破解密码,论坛灌水等等功能,
制作网站验证码必须要尊重一点,就是复杂但不要过度影响用户体验,这里就不得不吐槽一下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 importImage,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\untitled1dsafArial.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
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'] = codeimg.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 验证码登录 {% csrf_token %}
然后设置url 编辑urls.py
from dsaf import viewsurlpatterns = [ url(r'^create_code/$',views.create_code_img), url(r'^index/',views.test_code),]
ok 代码编写部分基本完成。由于以上代码使用到了session ,所以要生成一下django的数据库
python manage.py makemigrationspython manage.py migrate执行上面两条指令即可
全部搞定,咱们启动测试一下。
python manage.py runserver 0.0.0.0:8080
浏览器访问一下 http://127.0.0.1:8000/index/ 不出意外的话你将看到如下界面。
怎么样,如果你跟着本教程一起写是否看到了验证码界面呢。
领取专属 10元无门槛券
私享最新 技术干货