第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:8000http://localhost:8000

  • 局域网访问:使用本机的局域网 IP(如 http://192.168.1.100:8000,具体 IP 通过 ipconfigifconfig 查看)。

  • 公网访问:需要公网 IP 和端口转发(通常需要配置路由器或云服务器安全组)

三、Enum是什么?

  1. 枚举(Enum)的基本概念:枚举是一种特殊的数据类型,它由一组固定的常量组成。这些常量代表了一组相关的值,并且每个常量都有一个唯一的名称。例如,在 Python 中,可以使用 enum.Enum 来定义枚举类型:
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

在这个例子中,Color 是一个枚举类型,它包含了三个枚举成员:REDGREENBLUE,每个成员都有一个与之关联的值(这里是整数 1、2、3)。

  1. 获取枚举值的方式
    • “使用 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)):
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐