? 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分[计算机](https://baike.baidu.com/item/计算机)和人类的[图灵测试](https://baike.baidu.com/item/图灵测试))的缩写,是一种区分用户是计算机还是人的公共全自动[程序](https://baike.baidu.com/item/程序/71525)。可以防止:恶意破解密码、[刷票](https://baike.baidu.com/item/刷票/6540942)、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
```python
#Django
from django.shortcuts import render,HttpResponse
from django.views import View
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import serializers
from django.contrib.auth.hashers import make_password,check_password
from . import models
import memcache
from django.core.mail import send_mail
from web.settings import DEFAULT_FROM_EMAIL
#导入图片库
#导入绘画库
from PIL import ImageDraw
#字体库
from PIL import ImageFont
#随机库
import random
#图片库
from PIL import Image
#文件流
import io
#获取随机6位字符
def get_random_str():
a_=list([chr(var) for var in range(97,123)]) #小写字母
A_=list([chr(var) for var in range(65,91)]) #大写字母
num_=[str(var) for var in range(0,9)] #数字
return ‘‘.join(random.sample(a_+A_+num_,4)) #返回随机4位字符
#定义验证码类
class Mycode(View):
#定义随机取色方法,混淆
def get_random_color(self):
#三原色
R=random.randrange(255)
G=random.randrange(255)
B=random.randrange(255)
return (R,G,B)
def get(self,request):
#定义画布
image_size=(120,60)
#定义图像 颜色种类 画布 背景颜色
image=Image.new(‘RGB‘,image_size,‘white‘)
#定义画笔
draw=ImageDraw.Draw(image,‘RGB‘)
#随机字符串的组成
source=get_random_str()
#定义一个容器,接收
code_str=‘‘
for i in range(4):
#取色
text_color=self.get_random_color()
#获取一个字符串
tmp_num=random.randrange(len(source))
#获取字符集
random_str=source[tmp_num]
#将随机生成的字符串放入定义好的容器
code_str+=random_str
#将文字输入绘图
#宽高,字符,颜色
draw.text((10+30*i,20),random_str,text_color)
#建立io文件流
buf=io.BytesIO()
#将图片内容保存在内存中
image.save(buf,‘png‘)
#将验证码放入session
request.session[‘code‘]=code_str
#可以存入redis中 建立连接 存key 取key
return HttpResponse(buf.getvalue(),‘image/png‘) #从内存中获取数据
<image ":src=src" @click=‘changecode‘>
src=‘http://127.0.0.1:8000/api/mycode/‘
methods:{
//点击刷新验证码
//每次给它传一个随机字符,只要传了参数,就不会缓存,直接刷新
//在js中随机生成字符
let num = Math.ceil(Math.random()*10);
this.src=this.src+‘?code=‘+num;
changecode(){
}
}
原文:https://www.cnblogs.com/djl-0628/p/14597915.html