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,学习)