Python WEB框架之FastAPI

Python WEB框架之FastAPI

今天想记录一下最近项目上一直在用的Python框架——FastAPI。

个人认为,FastAPI是我目前接触到的Python最好用的WEB框架,没有之一。

之前也使用过像Django、Flask等框架,但是Django就用起来太重了,各种功能都糅杂在一起;Flask 框架虽说简单,但又只是单线程需要自己改造才支持多并发。

FastAPI貌似结合弥补了Flask 框架的缺陷,如果你想要快速搭建一个WEB服务,用FastAPI准没错。

OK,开始今天的笔记。

一、安装FastAPI

pip install fastapi uvicorn python-multipart

二、示例代码

from fastapi import FastAPI
import uvicornapp = FastAPI()@app.get("/")
def index():return "Hello World"if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

运行起来之后,您应该会看到下面的画面:
在这里插入图片描述
浏览器访问你的ip地址加端口号,应该就能看到“Hello World”。
在这里插入图片描述

三、接受请求参数

1、直接通过参数名接受,参数名即传参的名称。
@app.get("/info")
def handle_info(name, age):return f"Hello World, {name}, {age}"

这种方式必须接受name和age参数,如果缺少参数则会看到以下错误:
在这里插入图片描述
适用于GET请求且参数固定的情况。
正常传递后则不会发生错误:
在这里插入图片描述

2、使用Request对象传参

1)GET请求

from fastapi import FastAPI, Request@app.get("/request")
def handle_info(params: Request):return params.query_params

从fastapi库导入Request对象,使用Request对象作为接受参数。
在这里插入图片描述
2)POST请求

@app.post("/request")
async def handle_info(params: Request):form = dict(await params.form())return form

需要注意的是这里需要将使用asyncawait关键字,然后强转为 dict类型,就可以愉快的使用啦。
在这里插入图片描述
3)文件上传

# 图片批量上传
@app.post('/upload')
async def upload_file(params: Request, files: List[UploadFile] = File(...)):form = dict(await params.form())save_files = []for file in files:temp_arr = file.filename.split(".")suffix = temp_arr[len(temp_arr) - 1]file_name = f"img_{datetime.now().strftime('%Y%m%d%H%M%S%f')}.{suffix}"with open(file_name, "wb") as f:content = await file.read()  # 读取上传文件的内容f.write(content)  # 将内容写入文件save_files.append(file_name)return {"code": 200,"data": {"params": form,"save_files": save_files}}

实例为图片批量上传示例,使用Request对象进行接收,同时上传的文件也会被映射到files参数中。
可通过file.read() 读取文件内容,file.filename可拿到上传的文件名。
单文件上传,个人觉得可以沿用。

前端上传文件示例代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><input type="file" name="" id="file" multiple onchange="upload()"><div id="output"></div>
</body>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script type="text/javascript">let upload = () => {let el_file = document.querySelector("#file")let output = document.querySelector("#output")const form = new FormData();for (let i = 0; i < el_file.files.length; i++) {form.append('files', el_file.files[i]);}form.append("name", "zhangsan");form.append("age", 20);this.uploadStage = true;axios.post('http://127.0.0.1:8000/upload', form, {headers: { 'Content-Type': 'multipart/form-data' }}).then(res => {output.innerHTML = JSON.stringify(res.data)}).catch(err => {output.innerHTML = JSON.stringify(err)});}
</script>
</html>

示例结果:
在这里插入图片描述

四、跨域设定

from starlette.middleware.cors import CORSMiddleware
# 添加CORS中间件
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)

*号部分可自由配置。

五、指定静态资源目录

from fastapi.staticfiles import StaticFiles
app.mount("/static", StaticFiles(directory="static"), name="static_resources")

static目录挂载为静态目录,当访问 /static时直接返回该文件内容。
把上述文件上传的示例文件index.html放到static文件夹下,则可直接通过 /static/index.html 访问。
在这里插入图片描述

六、返回文件

from starlette.responses import FileResponse@app.get("/index")
def home():return FileResponse("static/index.html")

可通过FileResponse类返回指定文件的内容。用于做图片的预览、文件下载等功能。
现在也可以通过 /index 访问到 static/index.html 文件了。
在这里插入图片描述
以上,就是本次用到的fastapi 框架的相关内容。
相信以上知识已经足够解决日常的开发问题,希望看到的小伙伴不迷路。
欢迎大家留言探讨。

最后,奉上完整示例代码:

from datetime import datetime
from typing import Listfrom fastapi import FastAPI, Request, UploadFile, File
import uvicorn
from starlette.middleware.cors import CORSMiddleware
from starlette.responses import FileResponse
from starlette.staticfiles import StaticFilesapp = FastAPI()
# 添加CORS中间件
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)app.mount("/static", StaticFiles(directory="static"), name="static_resources")@app.get("/")
def index():return "Hello World"@app.get("/index")
def home():return FileResponse("static/index.html")@app.get("/info")
def handle_info(name, age):return f"Hello World, {name}, {age}"@app.post("/request")
def handle_info(params: Request):return params.query_params@app.post("/request")
async def handle_info1(params: Request):form = dict(await params.form())return form# 图片批量上传
@app.post('/upload')
async def upload_file(params: Request, files: List[UploadFile] = File(...)):form = dict(await params.form())save_files = []for file in files:temp_arr = file.filename.split(".")suffix = temp_arr[len(temp_arr) - 1]file_name = f"img_{datetime.now().strftime('%Y%m%d%H%M%S%f')}.{suffix}"with open(file_name, "wb") as f:content = await file.read()  # 读取上传文件的内容f.write(content)  # 将内容写入文件save_files.append(file_name)return {"code": 200,"data": {"params": form,"save_files": save_files}}if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619219.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

苹果手机怎么查看历史足迹

1.解锁手机&#xff0c;点击设置&#xff0c;如下图。 2.进入到设置界面&#xff0c;点击【隐私】选项&#xff0c;如下图。 3.进入到隐私界面&#xff0c;点击【定位服务】&#xff0c;如下图。 4.进入定位服务界面&#xff0c;点击【系统服务】&#xff0c;如下图。 5.在打开…

苹果uwb定位技术

昨天的文章简单说明了手机定位的技术&#xff0c;文章写的比较简单&#xff0c;但是阅读量却还可以&#xff0c;这篇文章转一个uwb定位技术的文章&#xff0c;让更多的人了解这项技术。 相关阅读&#xff1a; 手机是怎么确定位置信息的&#xff1f; 载波和LoRa #前言 关于昨天的…

常见手机定位方式浅谈

引言 前段时间在知乎上回答了一个关于手机定位相关的问题&#xff0c;被一个知友问到“加一个人微信聊天之后&#xff0c;收到了人家的一个视频&#xff0c;随后也把这个人及他发的视频都删除了&#xff0c;几天后在网吧上网&#xff0c;被别人定位到了&#xff0c;勒索了一笔钱…

苹果手机如何显示定位服务器地址,iOS8定位服务在哪?苹果iPhone6/Plus开启或关闭定位方法图文介绍...

以下是具体的iPhone6/Plus开启或关闭定位方法&#xff0c;适合所有iOS8系统的iPhone设备。 iOS8定位服务在哪&#xff1f; 定位服务关系用户隐私方面的东西&#xff0c;因此iOS8定位服务在iOS8设置中的“隐私”设置中&#xff0c;大家可以在下面的iOS8开启或者关闭定位服务教程…

小程序定位苹果手机可以,但是安装手机获取不到定位

1.确认是否开通定位权限 如果还没有权限&#xff0c;就去申请&#xff1a;申请时 注明场景&#xff0c;多上传几张 那个位置需要上传的照片 更容易通过本人申请场景(参考)&#xff1a;需要获取工人拍照验收位置照片注明定位位置时间&#xff0c;验证工人师傅在现场 审核是否通…

vscode 对模型train、detect脚本进行Debug时配置参数

我们训练yolov5代码时&#xff0c;一般会配置一些参数&#xff0c;比如模型权重文件--weights, 模型的配置文件--cfg, 以及训练的数据--data, 对应的训练脚本为: 训练train python train.py -- weights ./yolov5s.pt --cfg models\yolov5s.yaml --data ./data/coco128.yaml…

uniapp iOS打包证书申请流程——window

uniapp 如何在 window 创建 iOS打包证书&#xff1f; 文章目录 uniapp 如何在 window 创建 iOS打包证书&#xff1f;下载 Appuploader安装创建证书相关入口创建证书创建描述文件运行调试账号过期提示 前提&#xff1a; 下载 Appuploader工具 Appuploader辅助工具&#xff0c;解…

微服务学习资料

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册&#xff1a;Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式&#xff1f;2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …

监控摄像头镜头焦距计算方法

一、公式计算法&#xff1a; 视场和焦距的计算 视场系指被摄取物体的大小&#xff0c;视场的大小是以镜头至被摄取物体距离&#xff0c;镜头焦头及所要求的成像大小确定的。 1、镜头的焦距&#xff0c;视场大小及镜头到被摄取物体的距离的计算如下&#xff1b; …

手把手教你如何调配监控镜头

监控镜头指监控摄像机的镜头&#xff0c;由于监控摄像机只是一个单一的视频扑捉设备&#xff0c;镜头的像素和分辨率比电脑的视频头要高但是赶不上专业的数码相机或dv。在闭路监控体系中&#xff0c;摄像机又称摄像头或CCD&#xff08;Charge Coupled Device&#xff09;即电荷…

中国式安全感:2亿视频监控镜头守护社会生活

随着科技发展&#xff0c;视频监控设备早已成为保障城市公共安全的必需品&#xff0c;车站、公园、公路、街角随处可见&#xff0c;数量庞大的视频监控设备从各方面为社会安全与智慧化发展提供了有力保障。 打造中国式安全感 监控覆盖面不断扩大 古往今来&#xff0c;更高的社…

监控相机镜头 焦距

1、相机上面的数字6mm 8mm 12mm,这些是摄像头的焦距 2、镜头毫米数越小&#xff0c;看到的画面视角越宽&#xff0c;视线也就越近&#xff0c;远处的地方就会看不清楚&#xff0c;越大的镜头&#xff0c;照出来画面视视角越窄&#xff0c;视线越远 3、安装的距离与高度&#xf…

监控摄像机如何选择镜头视场角

监控摄像机如何选择镜头视场角 对于监控摄像机如何选取合适的镜头&#xff0c;是一门学问。对于监控摄像机厂商&#xff0c;无论是用在家里&#xff0c;办公室&#xff0c;用在电梯&#xff0c;用在公共场所等等&#xff0c;在选择使用多大视场角的镜头及配合什么样的CCD&#…

2.8/4/6/8mm/12mm焦距的镜头分别能监控多大范围?

2.8/4/6/8mm/12mm焦距的镜头分别能监控多大范围&#xff1f; 相关介绍 一、焦距和监控距离的关系 我司IPC镜头焦距有2.8/4mm/6mm/8mm等多种选择&#xff0c;可以满足室内外各种环境的拍摄需求。IPC每个产品系列都可以选择镜头焦距&#xff0c;产品型号末位即表示镜头焦距&am…

docker,nvidia-docker安装

卸载先前的docker Docker 的旧版本被称为 docker&#xff0c;docker.io 或 docker-engine 。如果已安装&#xff0c;请卸载它们&#xff1a; sudo apt-get remove docker docker-engine docker.io containerd runc使用 Docker 仓库进行安装 设置仓库 更新 apt 包索引 sudo…

Unix及类Unix系统文本编辑器的介绍

概述 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。VIM是纯粹的自由软件。 Vim普遍被推崇为类Vi编辑器中最好的一个&#xff0c;事实上真正的劲敌来自Emacs的不同变体。1999 年Emacs被选为Linuxworld文本编辑分类…

有趣免费的开源机器人课程实践指北-2019-

如果对机器人方向学习有些迷茫&#xff0c;推荐先阅读如下文章&#xff1a; 机器人工程师学习计划&#xff08;4.3k赞&#xff09;&#xff1a;https://zhuanlan.zhihu.com/p/22266788开源机器人学学习指南&#xff08;376赞&#xff09;&#xff1a;https://github.com/qqfly…

2022.管理类软件工具

管理类的工具软件 1 filezilla工具1.1 filezilla 绑定本地wps&#xff0c;可远程查看编辑 2 gitLab 本地代码类托管2.1 ubuntu 安装gitlab 3 tftp下载应用程序至开发板3.1 windows端安装服务器软件tftpd643.2 开发板内核需要配置tftp客户端 4 开发板操作常用指令5 vscode工具5.…

linux ultraedit安装教程,Linux系统安装最新版本Vim编辑器的简单方法整理

Vi编辑器已经存在了很长时间&#xff0c;它是在1976年左右开发使用的&#xff0c;Vi编辑器为用户提供了传统而强大的功能&#xff0c;例如有效的编辑界面&#xff0c;终端控制等。 但是&#xff0c;Vi编辑器缺少某些吸引人的功能&#xff0c;例如多个屏幕&#xff0c;语法高亮显…