一个计算机技术爱好者与学习者

0%

FastAPI入门篇

1. FastAPI简介

FastAPI 是一个现代、快速(高性能)的 Python Web 框架,用于构建 API。它基于 Python 3.6 及以上版本,并且利用了 Python 类型提示的功能。FastAPI 旨在帮助开发者快速构建出高性能的 API,并且具有自动生成文档的功能。

参考文档:

2. FastAPI的特性

FastAPI的关键特性包括:

  • 快速:可与 NodeJS 和 Go 并肩的极高性能,是最快的 Python Web 框架之一。高性能归功于 Starlette 和 Pydantic,Starlette 提供了底层的异步功能,而 Pydantic 则处理数据解析和验证。
  • 高效编码:提高功能开发速度约 200% 至 300%。
  • 更少 bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema

3. FastAPI与ASGI

Django是一个Python Web框架,同时也可以作为Web Server,只不过性能差一些。我们通常会在Django的上层配置一个WSGI或ASGI服务器,用来提升性能。

而FastAPI这个Python Web框架,本身是不可以作为Web Server的,因此必须要配置一个ASGI服务器。

ASGI(Asynchronous Server Gateway Interface)是一种异步服务器网关接口,它是WSGI(Web Server Gateway Interface)的扩展和进化。ASGI旨在为Python Web服务、框架和应用之间提供一个标准的异步接口,以适应现代Web开发中对异步处理和多种协议支持的需求。

ASGI的主要特点包括:

  • 异步处理能力:ASGI支持异步编程,允许同时处理多个请求,通过使用事件循环和协程实现高并发性能,从而更好地应对大量并发请求。
  • 多协议支持:ASGI不仅支持传统的HTTP请求,还支持WebSocket、HTTP/2以及未来的协议,使其能够适应不断发展的Web技术。
  • 性能提升:由于ASGI的异步特性,它能够更高效地处理异步请求,提升性能和响应速度。
  • 框架支持:现代的Python Web框架,如FastAPI、Tornado以及Django 3.1以后的版本,都支持ASGI,这使得开发者可以利用ASGI的优势构建高性能的Web应用程序。

ASGI服务器,如Uvicorn、Hypercorn和Daphne,实现了这种异步的网关接口,允许开发者构建异步Web应用程序。这些服务器能够处理来自客户端的请求,并将其传递给ASGI应用程序,同时ASGI应用程序可以异步地处理这些请求并返回响应。

总的来说,ASGI是构建现代、高性能、异步Web应用程序的关键技术,它通过支持异步处理和多协议,为Python Web开发提供了强大的支持。

4. 安装使用FastAPI

4.1. 安装FastAPI和Uvicorn

1、安装fastapi

1
pip install fastapi

2、安装uvicorn

1
pip install uvicorn

Uvicorn是一个轻量级的 ASGI 服务器,用于运行 FastAPI 应用。
生产环境的 ASGI 服务器通常使用 Uvicorn 或者 Hypercorn

4.2. Hello World

1、编写代码 main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}

2、运行代码

1
uvicorn main:app --reload

--reload 参数使得服务器在代码改变时自动重载,适用于开发阶段。

3、测试访问

1
2
curl http://127.0.0.1:8000
curl http://127.0.0.1:8000/items/5?q=somequery

4、查看接口文档
浏览器访问 http://127.0.0.1:8000/docs

我们会看到自动生成的交互式 API 文档(由 Swagger UI 生成)。

4.3. 启动命令常规化

uvicorn main:app --reload 这种启动命令,不方便记忆。
本节中,我们将启动命令改为:python main.py

实现方法:main.py 脚本中调用 uvicorn.run()

1
2
3
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

5. FastAPI基础

5.1. 路径操作和参数

FastAPI 允许定义路径操作装饰器(如 @app.get, @app.post 等),并直接在函数参数中声明预期的请求数据类型。

1
2
3
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}

5.2. 请求体和JSON

对于需要请求体的接口,我们可以使用 Pydantic 模型来定义请求体的结构。

1
2
3
4
5
6
7
8
9
10
11
from pydantic import BaseModel

class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None

@app.post("/items/")
async def create_item(item: Item):
return {"name": item.name, "price": item.price}

5.3. 数据验证

FastAPI 会自动验证传入的数据是否符合预期的类型和结构,并在不符合时返回错误信息。

5.4. 文档和交互式API

访问 http://127.0.0.1:8000/docshttp://127.0.0.1:8000/redoc 可以查看自动生成的 API 文档。

这些文档是交互式的,可以直接在浏览器中测试 API。

5.5. 进阶使用

FastAPI 还支持依赖注入、中间件、安全性(如 OAuth2)、数据库集成等高级功能。

6. FastAPI项目结构规划

参考文档:

6.1. 推荐项目结构一

1
2
3
4
5
6
7
8
9
10
11
12
13
sampleproject
├── LICENSE.txt
├── noxfile.py
├── pyproject.toml
├── README.md
├── src
│   └── sample
│   ├── __init__.py
│   ├── package_data.dat
│   └── simple.py
└── tests
├── __init__.py
└── test_simple.py

6.2. 推荐项目结构二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
my_fastapi_project/
├── app/
│ ├── __init__.py
│ ├── main.py # 入口文件
│ ├── core/
│ │ ├── __init__.py
│ │ ├── config.py # 配置文件
│ │ ├── security.py # 安全相关
│ │ └── ... # 其他核心功能
│ ├── api/
│ │ ├── __init__.py
│ │ ├── v1/
│ │ │ ├── __init__.py
│ │ │ ├── endpoints/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── users.py # 用户相关接口
│ │ │ │ ├── items.py # 其他接口
│ │ │ │ └── ...
│ │ │ └── ... # 其他版本的API
│ ├── models/
│ │ ├── __init__.py
│ │ ├── user.py # 用户模型
│ │ ├── item.py # 其他模型
│ │ └── ...
│ ├── schemas/
│ │ ├── __init__.py
│ │ ├── user.py # 用户数据模型
│ │ ├── item.py # 其他数据模型
│ │ └── ...
│ ├── crud/
│ │ ├── __init__.py
│ │ ├── user.py # 用户CRUD操作
│ │ ├── item.py # 其他CRUD操作
│ │ └── ...
│ ├── db/
│ │ ├── __init__.py
│ │ ├── base.py # 数据库基础设置
│ │ ├── session.py # 数据库会话
│ │ └── ...
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── test_main.py # 测试主文件
│ │ ├── test_users.py # 用户相关测试
│ │ └── ...
│ └── utils/
│ ├── __init__.py
│ ├── utils.py # 工具函数
│ └── ...
├── .env # 环境变量文件
├── alembic/ # 数据库迁移工具目录
│ ├── env.py
│ ├── script.py.mako
│ └── versions/
│ └── ...
├── alembic.ini # Alembic 配置文件
├── requirements.txt # 项目依赖
├── Dockerfile # Docker 配置文件
└── README.md # 项目说明文件

7. 小结

FastAPI 是一个强大的 Python Web 框架,特别适合用于构建 API。
通过上面的内容,我们可以快速开始使用 FastAPI 来构建我们的应用。
FastAPI 的文档和社区资源非常丰富,可以帮助我们深入了解和解决更复杂的问题。推荐阅读官方文档以获取更多高级特性和最佳实践。