fastapi 学习

2024-08-26 14:44
文章标签 学习 fastapi

本文主要是介绍fastapi 学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、前置知识
1.1、HTTP 协议
1.2、I/O 密集型和 CPU 密集型
慢操作
计算机/程序 🤖一些相对较慢(与处理器和 RAM 存储器的速度相比)的 I/O 操作,比如说:
● 通过网络发送来自客户端的数据
● 客户端接收来自网络中的数据
● 磁盘中要由系统读取并提供给程序的文件的内容
● 程序提供给系统的要写入磁盘的内容
● 一个 API 的远程调用
● 一个数据库操作,直到完成
● 一个数据库查询,直到返回结果
● 等等.
I/O 密集型
这个执行的时间大多是在等待 I/O 操作,因此它们被叫做 “I/O 密集型” 操作
CPU 密集型
大多数执行时间是由实际工作(而不是等待)占用的,并且计算机中的工作是由 CPU 完成的,所以他们称这些问题为"CPU 密集型"
CPU 密集型操作的常见示例是需要复杂的数学处理。
例如:
● 音频或图像处理;
● 计算机视觉: 一幅图像由数百万像素组成,每个像素有3种颜色值,处理通常需要同时对这些像素进行计算;
● 机器学习: 它通常需要大量的"矩阵"和"向量"乘法。想象一个包含数字的巨大电子表格,并同时将所有数字相乘;
● 深度学习: 这是机器学习的一个子领域,同样适用。只是没有一个数字的电子表格可以相乘,而是一个庞大的数字集合,在很多情况下,你需要使用一个特殊的处理器来构建和使用这些模型。
1.3、同步和异步
同步
去等待慢操作完成的确切时刻,而在此期间不做任何事情直到能够获取任务结果才继续工作
异步
等待慢操作📝完成的这段时间,计算机可以做一些其他工作

1.4、async 和 await
使用 async def,Python 就知道在该函数中,它将遇上 await,并且它可以"暂停" ⏸ 执行该函数,直至执行其他操作 🔀 后回来。

TODO: async 和 await 的协同工作原理设计到协程,后续可以深入研究
async def get_burgers(number: int):
# Do some asynchronous stuff to create the burgers
return burgers

@app.get(‘/burgers’)
async def read_burgers():
burgers = await get_burgers(2)
return burgers

注意
● await 只能在 async def 定义的函数内部使用。
● await必须"等待"通过 async def 定义的函数
● 带 async def 的函数也只能在 async def 定义的函数内部调用
● 那么,这关于先有鸡还是先有蛋的问题,如何调用第一个 async 函数?
○ 因为"第一个"函数将是你的路径操作函数,FastAPI 将知道如何做正确的事情

1.5、协程
TODO:深入理解协程并发和线程并发

1.6、restful api 的理解

  1. 对数据的 CRUD 操作,用相同的请求路径(即只出现资源的名词,不出现 get、add 等动词)
  2. 操作的区别主要体现在请求方法的差异上

在开发 API 时,你通常使用特定的 HTTP 方法去执行特定的行为。
通常使用:
● POST:创建数据。
● GET:读取数据。
● PUT:更新数据。
● DELETE:删除数据。

2、quick start
pip install fastapi
pip install uvicorn

from fastapi import FastAPI

创建一个 fastapi 应用

app = FastAPI()

提供访问接口

@app.get(“/”)
async def root():
return {“msg”: “hello world”}

2.1、shell 启动
uvicorn demo_1:app --reload

查看效果:http://127.0.0.1:8000/
API 文档:
http://127.0.0.1:8000/docs
http://127.0.0.1:8000/redoc

2.2、py 文件启动

3、路径操作
3.1、路径操作装饰器

常用

@app.get()
@app.post()
@app.put()
@app.delete()

不常用

@app.patch()
@app.options()
@app.head()
@app.trace()

3.2、参数简介

3.3、路由分发
app.include_router 统一管理路由

4、请求与响应
具象化理解路径参数和查询参数

4.1、路径参数
查询路径上的动态参数,如 {user_id}

当匹配到多个路径时,响应先定义的,测试如下图

4.2、查询参数

Union 是当有多种可能的数据类型时使用,比如函数有可能根据不同情况有时返回str或返回list,那么就可以写成Union[list, str]
Optional 是Union的一个简化, 当 数据类型中有可能是None时,比如有可能是str也有可能是None,则Optional[str], 相当于Union[str, None]

4.3、请求体数据
当你需要将数据从客户端(例如浏览器)发送给 API 时,你将其作为「请求体」发送。请求体是客户端发送给 API 的数据。响应体是 API 发送给客户端的数据。
FastAPI 基于 Pydantic ,Pydantic 主要用来做类型强制检查(校验数据)。不符合类型要求就会抛出异常。

4.4、form 表单
在 OAuth2 规范的一种使用方式(密码流)中,需要将用户名、密码作为表单字段发送,而不是 JSON。
FastAPI 可以使用Form组件来接收表单数据,需要先使用pip install python-multipart命令进行安装。

4.5、文件上传

4.6、Request 对象
有些情况下我们希望能直接访问Request对象。例如我们在路径操作函数中想获取客户端的IP地址,需要在函数中声明Request类型的参数,FastAPI 就会自动传递 Request 对象给这个参数,我们就可以获取到 Request 对象及其属性信息,例如 header、url、cookie、session 等。

4.7、请求静态文件
挂载静态文件

4.8、响应模型相关参数
4.8.1、response_model
控制返回数据

4.8.2、response_model_exclude_unset

设置为 True 和 False 的区别在于 返回结果是否排除未设置的值

4.8.3、INCLUDE和EXCLUDE
响应结果 :包含和排除

5、ORM 操作
SQLAlchemy
https://fastapi.tiangolo.com/zh/tutorial/sql-databases

6、中间件与跨域
import time

from fastapi import FastAPI, Request

app = FastAPI()

@app.middleware(“http”)
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers[“X-Process-Time”] = str(process_time)
return response

import time

from fastapi import FastAPI, Request

app = FastAPI()

@app.middleware(“http”)
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers[“X-Process-Time”] = str(process_time)
return response

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
“http://localhost.tiangolo.com”,
“https://localhost.tiangolo.com”,
“http://localhost”,
“http://localhost:8080”,
]

app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=[““],
allow_headers=[”
”],
)

@app.get(“/”)
async def main():
return {“message”: “Hello World”}

7、via

  1. https://fastapi.tiangolo.com/zh
  2. https://www.bilibili.com/video/BV1Ya4y1D7et
  3. https://cloud.tencent.com/developer/article/2067969
  4. https://wenku.csdn.net/answer/1fa1ii7en6

这篇关于fastapi 学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108858

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件