随笔 - 134,  文章 - 0,  评论 - 0,  阅读 - 21316

实际问题

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⊙)…

posted on   Steam残酷  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示