fastapi教程进阶
一个简单的栗子
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
FASTAPI继承Starlette,因此在Starlette中的所有可调用的对象在FASTAPI中可以直接引用
编写步骤
步骤一:导入FastAPI
from fastapi import FastAPI
步骤二:创建FastAPI实例
app = FastAPI()
步骤三:创建访问路径
@app.get("/")
这个路径告诉FastAPI,该装饰器下的方法是用来处理路径是“/”的GET请求
步骤四:定义方法,处理请求
async def root():
步骤五:返回响应信息
return {"message": "Hello World"}
步骤六:运行
uvicorn main:app --reload
获取路径参数
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id):
return {"item_id": item_id}
路径中的item_id将会被解析,传递给方法中的item_id。请求http://127.0.0.1:8000/items/foo会返回如下结果:
{"item_id":"foo"}
也可以在方法中定义参数类型:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
继续请求http://127.0.0.1:8000/items/3,会返回
{"item_id":3}
此时的item_id是int类型的3,而不是string类型,这是因为FastAPI在解析请求时,自动根据声明的类型进行了解析
如果请求http://127.0.0.1:8000/items/foo,此时会返回:
{
"detail": [
{
"loc": [
"path",
"item_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
这是因为foo并不能转换成int类型。请求http://127.0.0.1:8000/items/4.2也会出现上述错误
所有的数据类型验证,都是通过Pydantic完成的
如果想对路径参数做一个预定义,可以使用Enum:
from enum import Enum
from fastapi import FastAPI
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):
if model_name == ModelName.alexnet:
return {"model_name": model_name, "message": "Deep Learning FTW!"}
if model_name.value == "lenet":
return {"model_name": model_name, "message": "LeCNN all the images"}
return {"model_name": model_name, "message": "Have some residuals"}
打开http://127.0.0.1:8000/docs:

除此之外,假如想接收一个路径参数,它本身就是一个路径,就像/files/{file_path},而这个file_path是home/johndoe/myfile.txt时,可以写成/files/{file_path:path}:
from fastapi import FastAPI
app = FastAPI()
@app.get("/files/{file_path:path}")
async def read_user_me(file_path: str):
return {"file_path": file_path}
OpenAPI本身不支持在路径参数包含路径,但是可以当作Starlette内部的一个使用方法
此时访问http://127.0.0.1:8000/files/home/johndoe/myfile.txt,返回:
{"file_path":"home/johndoe/myfile.txt"}
如果将路径改为/files/{file_path},会返回:
{"detail":"Not Found"}
获取查询参数
这里依旧是一个例子:
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
return fake_items_db[skip : skip + limit]
尝试访问http://127.0.0.1:8000/items/?skip=0&limit=2,返回:
[{"item_name":"Foo"},{"item_name":"Bar"}]
尝试访问http://127.0.0.1:8000/items/,返回:
[{"item_name":"Foo"},{"item_name":"Bar"},{"item_name":"Baz"}]
由于我们在定义方法的时候,分别赋予skip和limit默认值,当不添加querystring时,会使用默认值。当然,我们也可以将默认值赋值为None:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
此时,我们请求http://127.0.0.1:8000/items/1?q=qqq:
{"item_id":"1","q":"qqq"}
值得放心的一点是,FastAPI很聪明,他知道参数来自哪里~
假如,我们不给参数默认值会发生什么情况呢?这里还是一个例子:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str):
item = {"item_id": item_id, "needy": needy}
return item
继续请求http://127.0.0.1:8000/items/1,会发现,返回报错:
{
"detail": [
{
"loc": [
"query",
"needy"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
fastapi教程进阶的更多相关文章
- Flink 实践教程-进阶(2):复杂格式数据抽取
作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...
- Flink 实践教程-进阶(5):排序(乱序调整)
作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...
- vue3.0新特性以及进阶路线
Vue3.0新特性/改动 新手学习路线 ===> 起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要 ...
- 【基础篇】hexo博客搭建教程
[基础篇]搭建hexo博客(一) 作者:Huanhao bilibili:Mrhuanhao 前言 你是否想拥有属于自己的博客?你是否无奈与自己不会写网站而烦恼? 不要担心,本系列教程将会实现你白嫖的 ...
- FastAPI(1)- 简单介绍
前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
- 新手入门指导:Vue 2.0 的建议学习顺序
起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...
- 初学Vue2.0--基础篇
概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...
- Vue.js 整理笔记
以前我们用Jquery进行dom的操作,虽然熟悉后开发效率很高,但是如果多个控件的相互操作多的情况下,还是会乱.相比之下,Vue的使用更加清晰,通过虚拟dom将数据绑定,而且组件化和路由的帮助下,让整 ...
随机推荐
- 一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]
[接上篇]"天下大势,分久必合,合久必分",ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系 ...
- 聊聊 C++ 中几类特殊成员函数
一:背景 在 C# 中要说类默认给我们定义的特殊成员函数,莫过于 构造函数,但在 C++ 中这样的特殊函数高达 6 种,有必要整合一下聊一聊. 二:特殊成员函数 1. 默认构造函数 和 C# 一样,很 ...
- 本机通过IP地址连接Ubuntu18.04+ on Vmware
一.Vmware-顶部菜单栏-编辑-虚拟网络编辑器: 点一下 添加一个NAT模式的网络:要记住名称,比如这里我的是VMnet8 子网ip可以自己写,建议全程就都按我这个写,后续方便校对. 点一下 NA ...
- CMU15445 (Fall 2019) 之 Project#4 - Logging & Recovery 详解
前言 这是 Fall 2019 的最后一个实验,要求我们实现预写式日志.系统恢复和存档点功能,这三个功能分别对应三个类 LogManager.LogRecovery 和 CheckpointManag ...
- Solution -「校内题」矩阵求和
Description 共 \(T\) 组数据.对于每组数据,给定 \(a, b, n\),求 \(\sum_{i = 1}^{n} \sum_{j = 1}^{n} \gcd(a^i - b^i, ...
- 难道ERP"死了",中台"凉了",低/无代码要称王了?
业内有一种说法,ERP经历了20多年的发展,其理念已经行不通,跟不上时代.后起之秀"中台"经历了崛起.走红.被传唱等阶段.并且已经冷却下来.此外,随着市场的不断变化,"低 ...
- Class对象共嫩
需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 实现: 1.配置文件 2.反射 步骤: 1.将需要创建的对象的全类名和需要执 ...
- 记vs2019 The view 'xxx' was not found.
版本:Visual Studio 2019 16.8.2/16.8.4.net core 3.1 1.检测是否是拼写错误2.检查.csproj为文件中是否包含有下面的content remove(这种 ...
- 推荐一款国产的高性价比profinet分布式IO模块
国产profinet分布式IO模块,兼容西门子PLC,可以平替西门子小型分布式IO模块,最大支持挂在32个IO,支持512个变量数据采集!采用高速背板通讯协议,轮询时间少于1MS.
- 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化
<深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...