FasAPI学习笔记(DataWhale课程)
本文介绍了FastAPI中的核心功能,包括路径参数、查询参数及其校验方法。首先,文章解释了HTTP请求的幂等性,并介绍了常见的HTTP请求方法。接着,文章详细说明了异步编程中async和await关键字的使用,以及如何在Jupyter Notebook中正确运行uvicorn.run()。此外,文章还探讨了0.0.0.0地址的含义及正确访问方式,并介绍了枚举类型(Enum)的基本概念和使用方法。最
第01课-路径参数
fastapi的核心功能是提供HTTP请求接口
在了解HTTP请求方式之前,我们先来了解一下“幂等”和“非幂等”。
-
幂等性,英文是idempotent,读作[a’dmptnt]。它的含义如下:
-
如果一个方法重复执行多次,产生的效果是一样的,那么这个方法就是幂等的
最常见的HTTP请求方法是四个:GET、DELETE、POST、PUT。 由于PUT和DELETE请求容易被黑客攻击,很多防火墙会默认屏蔽PUT和DELETE。
异步编程
在异步编程中,使用async和await关键字可以实现非阻塞的异步操作,从而提高程序的并发处理能力。
async是异步函数的声明关键字。当你定义一个函数时,如果在函数定义前加上async,那么这个函数就变成了一个异步函数。
异步函数与普通函数不同,它在执行时可以暂停,去执行其他任务,等到某个条件满足时再回来继续执行。
await关键字用于等待一个异步操作完成。它只能在异步函数内部使用。当你调用一个异步函数时,如果在这个调用前加上await,那么当前函数会暂停执行,直到被调用的异步函数
执行完毕。
Swagger UI是一个开源的工具,用于可视化和交互API资源,它基于OpenAPI规范,能够帮助开发者更直观地理解和测试API
if __name__ == '__main__'
:表示只有直接运行该python文件 时才会执行下面的代码
另外需要注意的是Uvicorn running onhttp://0.0.0.0:8000,并不能直接把http://0.0.0.0:8009贴到浏览器的地址栏。0.0.0.0的含义是这个服务向所有ip地址开放,但是你想要访问它,需要用部署这个服务的本地IP,比如http://127.0.0.1:8000。
一、为什么在 Jupyter Notebook 中运行 uvicorn.run()
会报错?
问题本质:
-
Jupyter 的异步环境:Jupyter Notebook
本身运行在一个异步的 event loop
(如 IPython 的内置事件循环)中。 -
uvicorn.run()
的同步设计:uvicorn.run()
是设计用于普通 Python 脚本的同步启动方式,它内部会创建一个新的事件循环。当在 Jupyter 中直接调用时,会导致多个事件循环冲突(因为 Jupyter 已经有一个正在运行的事件循环)。
解决方案:
需要手动创建 uvicorn.Server
对象,并通过 await server.serve()
在现有的 Jupyter 事件循环中运行
二、为什么不能直接访问 http://0.0.0.0:8000
?
关键概念:
-
0.0.0.0
的含义:表示服务器绑定到本机的所有网络接口(包括本地回环地址127.0.0.1
和局域网/公网 IP)。 -
访问时的地址:浏览器需要通过一个具体的 IP 或域名来访问服务,而
0.0.0.0
是一个特殊地址,仅用于服务器绑定,不能直接作为访问地址。
正确访问方式:
-
本地访问:使用
http://127.0.0.1:8000
或http://localhost:8000
。 -
局域网访问:使用本机的局域网 IP(如
http://192.168.1.100:8000
,具体 IP 通过ipconfig
或ifconfig
查看)。 -
公网访问:需要公网 IP 和端口转发(通常需要配置路由器或云服务器安全组)
三、Enum
是什么?
- 枚举(Enum)的基本概念:枚举是一种特殊的数据类型,它由一组固定的常量组成。这些常量代表了一组相关的值,并且每个常量都有一个唯一的名称。例如,在 Python 中,可以使用
enum.Enum
来定义枚举类型:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
在这个例子中,Color
是一个枚举类型,它包含了三个枚举成员:RED
、GREEN
和 BLUE
,每个成员都有一个与之关联的值(这里是整数 1、2、3)。
- 获取枚举值的方式:
- “使用
model_name.value
”:在上述Color
枚举类型的例子中,Color.RED
是一个枚举成员,Color.RED.value
可以用来获取该成员的值。例如:
- “使用
print(Color.RED.value)
输出结果为 1
。这里的 Color
可以理解为是一个枚举类型的名称(即 model_name
),RED
是该枚举类型中的一个成员。
预设值
如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 Python Enum 类型。
第02课-查询参数
-
当你为非路径参数声明了
默认值
时(目前而言,我们所知道的仅有查询参数),则该参数不是必需的。 -
如果你不想添加一个特定的值,而只是想使该参数成为可选的,则将
默认值设置为 None
。 -
但当你想让一个查询参数成为必需的,
不声明任何默认值
就可以
第03课-路径参数校验
from typing import Annotated
item_id: Annotated[float, Path(title="The ID of the item to get", ge=5.5)]
Annodated可选的声明数值校验:
-
gt:大于(greater tha n)
-
ge:大于等于(greater than or equ al)
-
lt:小于(less t han)
-
le:小于等于(less than or equal)
第04课-查询参数校验
额外的校验
我们打算添加约束条件:即使 q 是可选的,但只要提供了该参数,则该参数值不能超过5个字符的长度。
为此,首先从 fastapi 导入 Query:
现在,将 Query 用作查询参数的默认值,并将它的 max_length 参数设置为 5(以下为部分代码)
async def read_items(q: str | None = Query(default=None, max_length=5)):
更多推荐
所有评论(0)