django使用PLI生成验证码
python=3.6.8
django=2.1.8
Pillow=7.0.0
redis=3.3.1
工具形式的验证码生成 并存入redis
import random
import io
import redis
from PIL import ImageDraw, ImageFont, Image
from mysite.settings import BASE_DIR
def get_random_color():
"""
定义随机的字体颜色
:return:
"""
R = random.randrange(255)
G = random.randrange(255)
B = random.randrange(255)
return (R, G, B)
def mycode(image_id):
img_size = (120, 50)
image = Image.new('RGB', img_size, 'white')
draw = ImageDraw.Draw(image, 'RGB')
source = '0123456789'
code_str = ''
my_font = ImageFont.truetype(font="{}\\myutils\\fonts\\SourceCodePro-Bold.ttf".format(BASE_DIR), size=20)
for i in range(4):
text_color = 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, font=my_font)
buf = io.BytesIO()
conn_redis = redis.Redis(host='127.0.0.1', port=6379, db=1)
conn_redis.set(image_id, code_str, ex=300)
image.save(buf, 'png')
return buf.getvalue()
View
from django.views import View
from django.http import HttpResponse
from myutils.common import mycode
class RandomImageView(View):
def get(self, request, image_id):
return HttpResponse(mycode(image_id), 'image/png')
Urls
from django.urls import path
from . import views
urlpatterns = [
path('random_image/<str:image_id>/', views.RandomImageView.as_view()),
Vue中Register
<template>
<div>
<form >
<ul>
<li>
<label>用户名:</label>
<input type="text" v-model="username" >
</li>
<li>
<label>密 码:</label>
<input type="password" v-model="password" >
</li>
<li>
<label>验证码:</label>
<input type="text" v-model="image_code" class="msg_input" >
<img :src="image_code_url + code_cid + '/'" id="msg_code" @click="refresh" alt="图形验证码" class="pic_code">
</li>
<li class="reg_sub">
<input type="submit" value="登 陆" name="">
</li>
</ul>
</form>
</div>
</template>
<script>
export default {
data() {
return {
username: '',
password: '',
image_code: '',
code_cid: '',
image_code_url: 'http://127.0.0.1:8000/day01/random_image/',
}
},
methods: {
// 生成uuid随机字符串
generate_uuid() {
var d = new Date().getTime();
if (window.performance && typeof window.performance.now === "function") {
d += performance.now(); //use high-precision timer if available
}
var uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
/[xy]/g,
function(c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);
}
);
return uuid;
},
// 点击图片刷新验证码
refresh(){
this.code_cid = this.generate_uuid()
},
},
mounted() { // 页面加载完成以后,生成验证码
this.code_cid = this.generate_uuid()
}
}
</script>
CBV形式验证码
from django.conf import settings
from django.views import View
from django.http import HttpResponse
import random
import io
import redis
from PIL import ImageDraw, ImageFont, Image
class MyRandomStr(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_id):
img_size = (120, 50)
image = Image.new('RGB', img_size, 'white')
draw = ImageDraw.Draw(image, 'RGB')
source = '0123456789'
code_str = ''
my_font = ImageFont.truetype(font="{}\\myutils\\fonts\\SourceCodePro-Bold.ttf".format(settings.BASE_DIR), size=15)
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, font=my_font)
conn_redis = redis.Redis(host='127.0.0.1', port=6379, db=1)
conn_redis.set(image_id, code_str, ex=5)
buf = io.BytesIO()
image.save(buf, 'png')
return HttpResponse(buf.getvalue(), 'image/png')
验证码 复杂
from PIL import Image, ImageDraw, ImageFont
import redis
from verify.settings import FONTS_DIRS
import random
import os
from django.http import HttpResponse
import io
def generate_image_code(request, image_id):
'''
本地图片验证码生成函数
'''
bgcolor = (random.randrange(20, 100), random.randrange(
20, 100), random.randrange(20, 100))
width = 110
height = 40
im = Image.new('RGB', (width, height), bgcolor)
draw = ImageDraw.Draw(im)
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'
code_str = ''
for i in range(0, 4):
code_str += str[random.randrange(0, len(str))]
fonts_files = os.path.join(
FONTS_DIRS, 'SourceCodePro-Bold.ttf')
font = ImageFont.truetype(fonts_files, 30)
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))
draw.text((5, 2), code_str[0], font=font, fill=fontcolor1)
draw.text((25, 2), code_str[1], font=font, fill=fontcolor2)
draw.text((50, 2), code_str[2], font=font, fill=fontcolor3)
draw.text((75, 2), code_str[3], font=font, fill=fontcolor4)
del draw
print(rand_str)
conn_redis = redis.Redis(host='127.0.0.1', port=6379, db=1)
conn_redis.set(image_id, code_str, ex=5)
buf = io.BytesIO()
im.save(buf, 'png')
return HttpResponse(buf.getvalue(), 'image/png')