ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python-web验证码的实现

2021-03-15 22:55:03  阅读:161  来源: 互联网

标签:web draw code randint Python self random 验证码 def


此代码是需要依赖:

  • sanic==19.9.0

  • Pillow==7.0.0

马哥教育Python网络班企业教练思路:

import randomimport stringimport uuidimport base64import platformfrom PIL import Image, ImageDraw,ImageFontfrom io import BytesIOfrom sanic import Sanicfrom sanic.response import HTTPResponse,textfrom sanic.views import HTTPMethodView
app = 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:\WINDOWS\Fonts\STXINGKA.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, code

class SimpleView(HTTPMethodView):    body = """        <html>            <head>                <meta charset="UTF-8">                    <title>登录</title>                    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">                    <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->                    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">                    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->                    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>            </head>            <body>                <form class="form-inline" method="post" action="/code">                    <div>                        <div class="form-group">{error}                                                        </div>                        <div class="form-group">                                <label for="exampleInputName2">验证码</label>                                <input type="text" class="form-control" id="captcha" name="code">                        </div>                        <div class="form-group">                            <img src="data:image/jpeg;base64,{base64_data}" class="img-img-rounded">                        </div>                        <div>                            <button type="submit">验证</button>                        </div>                    </div>                </form>            </body>        </html>        """
   async def get(self, request):        return self.response(error="")
   async def post(self, request):        uuid = request.cookies.get("uuid", "1")        verfy_code = request.form.get("code", "2").lower()        code = session.get(uuid, "").lower()        if code == verfy_code:            return text('验证码正确')        return self.response(error='<input class="form-control" id="disabledInput" type="text" placeholder="验证码错误" disabled>')
   def response(self, error):        im, code = VerifyCode(5).get_verify_code()        buf = BytesIO()        im.save(buf, "jpeg")        buf_str = buf.getvalue()        base64_data = base64.b64encode(buf_str).decode()        id = uuid.uuid1().__str__()        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 response

app.add_route(SimpleView.as_view(), '/code')
if __name__ == "__main__":    app.run(host="0.0.0.0", port=8000)
简单的实现了验证码,没有实现点击刷新,点击刷新的原理不难:
异步请求+刷新接口就好了,记得更新对应的session的key里面的value


标签:web,draw,code,randint,Python,self,random,验证码,def
来源: https://blog.51cto.com/15127549/2660778

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有