苏彤,你的 Python Flask 编写生成二维码接口写完了

举报
梦想橡皮擦 发表于 2022/08/04 14:04:14 2022/08/04
【摘要】 需求背景本篇博客实战解决一个真是场景,需求描述如下:为团队其它成员提供一个二维码生成接口,传入文本,返回图片地址,数据存储到 OSS 中。采用 Python Flask 框架实现,并且使用一个第三方二维码模块,使用下述命令提前安装 qrcode。pip install qrcode同时还需要安装一下 pillow,可以使用清华源。pip install pillow -i https://...

需求背景

本篇博客实战解决一个真是场景,需求描述如下:
为团队其它成员提供一个二维码生成接口,传入文本,返回图片地址,数据存储到 OSS 中。

采用 Python Flask 框架实现,并且使用一个第三方二维码模块,使用下述命令提前安装 qrcode

pip install qrcode

同时还需要安装一下 pillow,可以使用清华源。

pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

入门级代码

直接编写如下代码,运行查看结果,由于博客无法上传二维码,顾不进行展示。

import qrcode

qr = qrcode.QRCode(
    version=3,error_correction=qrcode.constants.ERROR_CORRECT_Q,box_size=10,border=4
)
qr.add_data("https://www.pachong.vip")
qr.make(fit=True)
img = qr.make_image(fill_color="black",back_color="white")
img.show()

接下来对相关参数进行一下说明。

qrcode.QRCode() 参数清单:

  1. version:二维码大小,取值范围 1 到 40,当等于 1 时,大小是 21*21,取值为 None 或者后续使用 fit=true 时,二维码自动调整大小。
  2. error_correction:纠错级别,有如下取值:
    ERROR_CORRECT_L:7%以下会被纠正;
    ERROR_CORRECT_M:默认值,15%以下会被纠正;
    ERROR_CORRECT_Q:25%以下会被纠正;
    ERROR_CORRECT_H:30%以下会被纠正。
  3. box_size:每个个字的像素数,默认 10;
  4. border:二维码四周留白的格子,默认为 4;
  5. image_factory:图片生成形式,默认为 PIL,这也是为啥安装 pillow 的原因;
  6. mask_pattern:掩模。

qr.add_data() 添加要转换的内容,可以增加 optimize 参数,使用后,数据会被拆分为多个块进行优化。

make_image(fill_color=None, back_color=None,image_factory=None) 创建二维码图像并返回,可以使用 fill_color + back_color 添加颜色。

配合 Flask 制作 API

安装并搭建 Flask 框架,然后制作二维码生成接口,详细代码如下所示,其中 OSS 使用阿里云相关值即可。

import qrcode
from flask import Flask
from io import BytesIO
import time
import oss2


def upload_qrcode(bytes_content, qrcode_name):
    # 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    auth = oss2.Auth('AK', 'AS')
    # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    # 填写Bucket名称。
    bucket = oss2.Bucket(auth, 'oss-cn-beijing.aliyuncs.com', 'Bucket')

    # 填写Object完整路径和Bytes内容。Object完整路径中不能包含Bucket名称。
    bucket.put_object(qrcode_name, bytes_content)


app = Flask(__name__)

@app.route('/qrcode')
def qrcode_func():
    create_qrcode()
    return 'Hello, World!'


def create_qrcode():
    qr = qrcode.QRCode(
        version=3, error_correction=qrcode.constants.ERROR_CORRECT_Q, box_size=10, border=4
    )
    qr.add_data("https://www.pachong.vip")
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white")
    # print(type(img))
    img_byte = BytesIO()
    img.save(img_byte, format='PNG')
    binary_content = img_byte.getvalue()  # im对象转为二进制流
    upload_qrcode(binary_content)


if __name__ == '__main__':
    app.run(debug=True)

其中用到了 BytesIO 将图片转换为二进制流,便于直接上传到 oss 中,后续逻辑只需要在 Flask 中配置返回拼接的地址即可。

file_name = create_qrcode()
domain = "https://cdn.pachong.vip/qr/"
if file_name:
    data = {
        "src": domain + file_name,
        "code": 200
    }
else:
    data = {
        "src": "",
        "code": 500
    }
response = json.dumps(data)
return response, 200, {"Content-Type": "application/json"}

此时在通过浏览器访问,会得到一个 JSON 字符串,其中 src 就是拼接的 URL,code 是响应状态码。

{ "src": "https://cdn.pachong.vip/qr/1658397523.png", "code": 200 }

接下来给 Flask 加上一个 ULR 参数,二维码基于传入的 URL 生成,修改 qrcode_func() 函数,在其中增加参数获取逻辑。

url = request.args.get("url", None)
# print(url)
if url is None:
    return json.dumps({"msg": "缺少url", "src": "", "code": 500}), 200, {"Content-Type": "application/json"}

逻辑实现完毕之后,就可以上传 CentOS 系统进行部署了。

此时一个完整的 Python Flask 生成二维码项目就已经完成了~

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。