实际问题
dict->Json->二维码
2022.7.1
写一个接口能自动的将数据转换成json,然后变成二维码返回到页面
- FastAPI
- Python
- VsCode
from typing import Dict, Union
import uvicorn
from pydantic import BaseModel
import qrcode
import json
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import time
app = FastAPI()
#测试的实体类
class Data(BaseModel):
id:int
body:Union[Dict[str,object],None]=None
@app.post("/getImg")
def update_item(data: Data):
#转换json数据
json_str = json.dumps(data.body,indent=2, sort_keys=False, ensure_ascii=False)
#生产二维码
qrc = qrcode.make(json_str)
#图片的名字
img_name = '%s.png' % time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
#保存图片成二维码
qrc.save(img_name)
#读取文件
file_like = open(img_name, mode="rb")
#返回页面
return StreamingResponse(file_like, media_type="image/png")
if __name__ == '__main__':
#测试环境配置
uvicorn.run('main:app', reload=True, host='127.0.0.1', port=8000)
知识点:
1.学习了基本的FastAPI的相关知识--详细请看笔记
........
2.处理将一个字典变成Json
#导入json包
import json
#初始化一个字典数据
dict_ = {
'name': 'Jack',
'age': 22,
'skills': ['Python', 'Java', 'C++', 'Matlab'],
'major': '计算机技术',
'english': '英语六级',
'school': 'WIT'
}
json.dumps(字典):将字典转为JSON字符串
# 1. json.dumps(字典):将字典转为JSON字符串,indent为多行缩进空格数,
# sort_keys为是否按键排序,ensure_ascii=False为不确保ascii,及不将中文等特殊字符转为\uXXX等
json_dict = json.dumps(dict_)
print(json_dict)
优化:--格式更好看
dict_from_str = json.loads(json_dict)
print(dict_from_str)
dict_from_str_2 = json.loads(json_dict_2)
print(dict_from_str_2)
拓展----
- Json存储在文件中:
with open("write_json.json", "w", encoding='utf-8') as f:
# json.dump(dict_, f) # 写为一行
json.dump(dict_, f, indent=2, sort_keys=True, ensure_ascii=False) # 写为多行
- Json从文件中读取变成字典
with open("write_json.json", encoding="utf-8") as f:
json_file = json.load(f)
print(json_file)
3.生成一个二维码
-
介绍:
QR码是二维码的一种,相比普通一维条码具有快速读取和更大的数据存储容量。因此QR码的应用范围已经扩展到包括物品识别,文档管理等生活中的方方面面。本文重点介绍如何在Python中快速生成QR码。
-
安装 qrcode
在Python中安装qrcode非常方便,可以直接使用pip进行安装,命令如下:
pip3 install qrcode
- 生成 QR 码
在Python中生成相应的QR码也是非常简单的,我们仅仅需要导入相应的库,并传入我们需要包含的信息即可,样例代码如下:
import qrcode
img = qrcode.make('data')
img.save("some_file.png")
除了基本的文字之外,我们还可以将许多其他形式的数据放入 QR 图像中:例如 Web URL、字符序列、数字等。
- QR码添加信息
假如我们现在得到一个二维码,并且我们希望在原始的消息之上添加一些信息,此时我们可以使用 qrcode 提供的 add_data 函数,样例代码如下:
import qrcode
qr = qrcode.QRCode()
qr.add_data('your data1')
qr.add_data('your data2')
other_img = qr.make_image()
如果我们希望覆盖掉以前的信息,add_data函数也非常方便。我们需要做的就是额外添加另一个clear() 函数。代码如下:
import qrcode
qr = qrcode.QRCode()
qr.add_data('your data1')
img = qr.make_image()
qr.clear()
qr.add_data('your data2')
other_img = qr.make_image()
- 使用Opencv读取QR码
一般来说,我们通常可以用手机来检测QR码中包含的消息,但我们是程序员,让我们用程序的方式来获取相应的信息。此时我们需要用到OpenCV库,也可以通过pip来进行安装,命令如下:
pip3 install opencv-python
此时我们需要做的就是先将QR图像读取到我们的 Python 中,然后构建一个 QR 检测器。紧接着,我们就可以从二维码中读取数据了!
代码如下:
import cv2
img = cv2.imread("some_text.png")
detector = cv2.QRCodeDetector()
data, bbox, straight_qrcode = detector.detectAndDecode(img)
print(data)
4.发送图片到前端
from fastapi import FastAPI
from fastapi import FastAPI, File, UploadFile, Response
from fastapi.responses import StreamingResponse
# 返回图片
@app.post("/downloadfile2/")
async def download_files_stream():
file_like = open('as.png', mode="rb")
return StreamingResponse(file_like, media_type="image/jpg")
问题:
可能出现
pip install pillow
uniapp上->二维码->fastAPI
uniapp:
扫码页面:
<template>
<!-- 扫码 -->
<view>
<uni-icons type="scan" size="30" @click="scanCodeHandle()"></uni-icons>
<view>
<view v-if="qrCodeResult!=''">
<view style="padding: 20rpx 10rpx;">
<uni-section title="二维码结果" subTitle="二维码结果" type="line" padding>
<uni-easyinput type="textarea" autoHeight v-model="qrCodeResult" placeholder="请输入内容" ></uni-easyinput>
</uni-section>
</view>
<view>
<button type="primary" @click="postData()">上传数据</button>
</view>
</view>
</view>
</view>
</template>
<script>
import uniEasyinput from "@/components/uni-easyinput/uni-easyinput.vue"
import uniIcons from "@/components/uni-icons/uni-icons.vue"
export default {
data() {
return {
qrCodeResult:""
}
},
methods: {
// 点击扫码按钮
scanCodeHandle() {
let that = this;
uni.scanCode({
success: (res) => {
that.qrCodeResult=res.result
console.log('扫码成功', res)
},
fail: (err) => {
console.log('扫码失败', err)
},
complete: () => {
console.log('扫码结束')
}
})
},
//发送数据到后端
postData(){
uni.request({
url: 'http://127.0.0.1:8000/postData',
method: "POST",
data: {
"body":this.qrCodeResult
},
success: (res) => {
console.log(res)
}
})
}
}
}
</script>
<style>
</style>
遇到的问题:
- 一开始想用vant组件去写本来已经写好了微信小程序的全部,但是以上阿里巴巴就报错,最后看了官方发现有个增强的ui库,最后只能使用它了,还用了别人写的插件
微信的---wxcomponents
阿里的---mycomponents
最后后端的代码还要啥权限,搞得我-----(⊙o⊙)…
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现