1. 程式人生 > >Flask實戰第40天:圖片驗證碼生成技術

Flask實戰第40天:圖片驗證碼生成技術

all see pillow 字體大小 src print new line 訪問

安裝pillow

pip install pillow

在utils下新建python package命名為captcha

把需要需要用到的字體放在captcha下

技術分享圖片

編輯captcha.__init__.py, 生成驗證碼

技術分享圖片
import random
import string
# Image:一個畫布
# ImageDraw:一個畫筆
# ImageFont:畫筆的字體

# pip install pillow
from PIL import Image, ImageDraw, ImageFont


class Captcha(object):
    
# 生成幾位數的驗證碼 number = 4 # 驗證碼圖片的高度和寬度 size = (100, 30) # 驗證碼字體大小 fontsize = 25 #加入幹擾線條數 line_number = 2 #構建一個驗證碼源文本 SOURCE = list(string.ascii_letters) for index in range(0, 10): SOURCE.append(str(index)) #用來繪制幹擾線 @classmethod def
__gene_line(cls, draw, width, height): begin = (random.randint(0, width), random.randint(0, height)) end = (random.randint(0, width), random.randint(0, height)) draw.line([begin, end], fill=cls.__gene_random_color(), width=2) # 用來繪制幹擾點 @classmethod def __gene_points
(cls, draw, point_chance, width, height): chance = min(100, max(0, int(point_chance))) #大小限制在[0, 100] for w in range(width): for h in range(height): tmp = random.randint(0, 100) if tmp > 100 - chance: draw.point((w, h), fill=cls.__gene_random_color()) # 生成隨機的顏色 @classmethod def __gene_random_color(cls, start=0, end=255): random.seed() return (random.randint(start, end),random.randint(start, end), random.randint(start, end)) # 隨機選擇一個字體 @classmethod def __gene_random_font(cls): fonts = [ Courgette-Regular.ttf, LHANDW.TTF, Lobster-Regular.ttf, verdana.ttf ] font = random.choice(fonts) return utils/captcha/ + font # 用來隨機生成一個字符串 @classmethod def gene_text(cls, number): #num是生成驗證碼的位數 return ‘‘.join(random.sample(cls.SOURCE, number)) # 生成驗證碼 @classmethod def gene_graph_captcha(cls): #驗證碼圖片的高和寬 width, height = cls.size #創建圖片 image = Image.new(RGBA, (width,height),cls.__gene_random_color(0, 100)) #驗證碼的字體 font = ImageFont.truetype(cls.__gene_random_font(), cls.fontsize) #創建畫筆 draw = ImageDraw.Draw(image) #生成字符串 text = cls.gene_text(cls.number) #獲取字體尺寸 font_width, font_height = font.getsize(text) #填充字符串 draw.text(((width - font_width) / 2, (height - font_height) / 2), text, font=font, fill=cls.__gene_random_color(150, 255)) #繪制幹擾線 for x in range(0, cls.line_number): cls.__gene_line(draw, width, height) #繪制噪點 cls.__gene_points(draw, 10, width, height) return (text, image)
captcha.__init__.py

把驗證碼的視圖放到公共的視圖裏面。common.views.py

from flask import Blueprint, make_response
from utils.captcha import Captcha
from io import BytesIO

bp = Blueprint(common, __name__, url_prefix=/common)

@bp.route(/)
def index():
    return common index


@bp.route(/captcha/)
def graph_captcha():
    text, image = Captcha.gene_graph_captcha()
    out = BytesIO()
    image.save(out, png)
    out.seek(0)
    resp = make_response(out.read())
    resp.content_type = image/png
    return resp

訪問http://127.0.0.1:5000/common/captcha/

技術分享圖片

Flask實戰第40天:圖片驗證碼生成技術