sql实现random sample_web验证码的异步刷新实现

f89bf77c7133c768419f78b9d46cd1b5.png

接上回,上次和大家简单的介绍了下web验证码实现,也说了异步刷新验证码的实现逻辑,不过有些小伙伴还是建议我实现下,废话少说,上代码:此代码是需要依赖:sanic==19.9.0Pillow==7.0.0

import randomimport stringimport uuidimport base64import platformfrom PIL import Image, ImageDraw,ImageFontfrom io import BytesIOfrom sanic import Sanicfrom sanic.response import HTTPResponse,text, jsonfrom sanic.views import HTTPMethodViewapp = Sanic()session = {}class VerifyCode:    def __init__(self, numbers:int):        """        指定:生成的数量        """        self.number = numbers    def draw_lines(self, draw, num, width, height):        """划线"""        x1 = random.randint(0, width / 2)        y1 = random.randint(0, height / 2)        x2 = random.randint(0, width)        y2 = random.randint(height / 2, height)        draw.line(((x1, y1), (x2, y2)), fill='black', width=1)    def random_color(self):        """随机颜色"""        return random.randint(32, 127), random.randint(32, 127), random.randint(32, 127)    def gene_text(self):        """生成验证码"""        return "".join(random.sample(string.ascii_letters+string.digits, self.number))    def get_verify_code(self):        """        draw.text():            文字的绘制,第一个参数指定绘制的起始点(文本的左上角所在位置),第二个参数指定文本内容,第三个参数指定文本的颜色,第四个参数指定字体(通过ImageFont类来定义)        """        code = self.gene_text()        width, height = 130, 30        im = Image.new("RGB", (width, height), "white")        # 这里指定字体的路径        sysstr = platform.system()        font = None        if sysstr == "Windows":            font = ImageFont.truetype("C:WINDOWSFontsSTXINGKA.TTF", 25)        elif sysstr == "Darwin":            font = ImageFont.truetype('/Library/Fonts/AppleMyungjo.ttf', 25)        draw = ImageDraw.Draw(im)        for item in range(self.number):            draw.text((5+random.randint(-5, 5)+23*item, 5+random.randint(-5, 5)), text=code[item],                      fill=self.random_color(), font=font)            self.draw_lines(draw, self.number, width, height)        return im, codeclass SimpleView(HTTPMethodView):    body = """    登录    
{error}
验证码
验证
""" async def get(self, request): return self.response(id="", error="") async def post(self, request): uuid = request.cookies.get("uuid", "") method = request.form.get("type", "") if method: base64_data = self.put(request) return json({"status": "success", "result": {"base64_data": base64_data}}) verfy_code = request.form.get("code", "2").lower() code = session.get(uuid, "").lower() if code == verfy_code: return text('验证码正确') return self.response(id=uuid, error='') def put(self, request): uuid = request.cookies.get("uuid", "") base64_data, code = self.code() session[uuid] = code return base64_data def code(self): im, code = VerifyCode(5).get_verify_code() buf = BytesIO() im.save(buf, "jpeg") buf_str = buf.getvalue() base64_data = base64.b64encode(buf_str).decode() return base64_data, code def response(self, id, error): id = id if id else uuid.uuid1().__str__() base64_data, code = self.code() session[id] = code body = self.body.format(base64_data=base64_data, error=error) response = HTTPResponse(body, content_type="text/html; charset=utf-8") response.cookies["uuid"] = id return responseapp.add_route(SimpleView.as_view(), '')if __name__ == "__main__": app.run(host="0.0.0.0", port=8000)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值