ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flask——flask-uploads(文件上传)+Pillow(图形验证码)

2020-03-11 22:08:40  阅读:305  来源: 互联网

标签:__ .__ width Flask self randint flask code uploads


目录

  1. 文件上传
  2. 图形验证码

 

  1. 文件上传


    # 安装: pip install flask-uploads
    # 配置
    from flask_uploads import UploadSet, IMAGES
    from flask_uploads import configure_uploads
    from flask_uploads import patch_request_class
    import os
    app.config['UPLOADED_PHOTOS_DEST'] = os.getcwd()
    app.config['MAX_CONTENT_LENGTH'] = 8 * 1024 * 1024
    # 创建上传对象
    photos = UploadSet('photos', IMAGES)
    # 配置上传对象
    configure_uploads(app, photos)
    # 配置上传文件大小,默认为64M,
    # 若设置为None,则以MAX_CONTENT_LENGTH配置为准
    patch_request_class(app, size=None)
    
    # 视图函数
    @app.route('/upload/', methods=['GET', 'POST'])
    def upload():
        img_url = None
        if request.method == 'POST':
        # 获取上传对象
        photo = request.files.get('photo')
        if photo:
        # 保存上传⽂件,返回⽂件名
        filename = photos.save(photo)
        # 根据⽂件名获取上传⽂件的URL
        img_url = photos.url(filename)
        return render_template('upload.html', img_url=img_url)

     

  2. 图形验证码


    # pip install pillow
    import os
    from io import BytesIO
    from random import randint
    
    from PIL import Image, ImageFont, ImageDraw
    
    
    class VerifyCode:
        def __init__(self, width=100, height=40, size=4):
            self.width = width
            self.height = height
            self.size = size
            self.__code = ''  # 验证码字符串
            self.pen = None  # 画笔
    
        @property
        def code(self):
            return self.__code
    
        def generate(self):
            # 1)、创建画布
            im = Image.new("RGB", (self.width, self.height), self.__rand_color(150))
            self.pen = ImageDraw.Draw(im)
            # 2)、生成验证码字符串
            self.rand_string()
            # 3)、画验证码
            self.__draw_code()
            # 4)、画干扰点
            self.__draw_point()
            # 5)、画干扰线
            self.__rand_line()
            # 6)、返回验证码图片
            # 缓冲区
            buf = BytesIO()
            # 把图片放到缓冲区
            im.save(buf, 'png')
            # 获取图片的二进制
            res = buf.getvalue()
            buf.close()
            return res
            # im.save("vc.png")
    
        def __rand_color(self, min=0, max=255):
            return randint(min, max), randint(min, max), randint(min, max)
    
        # 验证码字符串
        def rand_string(self):
            self.__code = ''
            for i in range(self.size):
                self.__code += str(randint(0, 9))
    
        # 画验证码
        def __draw_code(self):
            # 加载字体
    
            path = os.path.join(os.getcwd(), 'static/fonts/SIMLI.TTF')
            print(path)
            font1 = ImageFont.truetype(path, size=20, encoding="utf-8")
    
            # 计算字符宽度
            width = (self.width - 20) // self.size
    
            # 逐个字符画
            for i in range(len(self.__code)):
                x = 13 + width * i  # 计算每个字符的x坐标
                self.pen.text((x, 9), self.__code[i], font=font1, fill=self.__rand_color(0, 80))
    
        # 画点
        def __draw_point(self):
            for i in range(100):
                self.pen.point((randint(1, self.width - 1), randint(1, self.height - 1)), self.__rand_color(30, 100))
    
        def __rand_line(self):
            for i in range(5):
                self.pen.line([(randint(1, self.width - 1), randint(1, self.height - 1)),
                               (randint(1, self.width - 1), randint(1, self.height - 1))], fill=self.__rand_color(50, 150),
                              width=2)
    
    
    # 单例属性
    vc = VerifyCode()
    
    if __name__ == '__main__':
        pass

     

标签:__,.__,width,Flask,self,randint,flask,code,uploads
来源: https://blog.csdn.net/piduocheng0577/article/details/104806763

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

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

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

ICode9版权所有