FastAPI 框架详解

目录

引言

特性

1. 异步支持

2. 类型提示

3. 自动生成文档

4. 数据验证与序列化

5. 依赖注入系统

6. 安全性

7. WebSocket 支持

快速上手

1. 安装 FastAPI

2. 编写第一个 FastAPI 应用

3. 运行应用

详细解析

1. 异步支持

2. 类型提示

3. 自动生成文档

4. 数据验证与序列化

5. 依赖注入系统

6. 安全性

7. WebSocket 支持

总结


引言

FastAPI 是一款现代化的 Python 后端框架,专注于提供高性能、快速开发的能力。由于其基于标准的 Python 类型提示和异步编程的支持,它在保持代码清晰可读的同时,能够实现出色的性能。FastAPI 是基于 Starlette 框架构建的,Starlette 是一个轻量级、高性能的异步框架,这也为 FastAPI 提供了强大的基础。

特性

1. 异步支持

FastAPI 是一个异步框架,利用 Python async await 关键字,允许并发处理多个请求,提高应用程序的性能。异步编程使得可以高效地处理 I/O 密集型任务,如数据库查询、网络请求等,从而更好地应对高并发的场景。

2. 类型提示

FastAPI 利用 Python 3.7+ 中引入的类型提示功能,使得代码更加规范、可读,并且通过类型检查工具如 Mypy 可以进行静态类型检查,提高代码质量。类型提示不仅仅用于函数参数和返回值,还能够用于请求和响应体,从而提供更好的文档生成和代码智能感知。

3. 自动生成文档

一个强大的特性是 FastAPI 可以自动生成交互式 API 文档。使用 Swagger UI ReDoc,你可以直接在浏览器中查看并测试 API,而无需手动编写文档。这大大简化了文档的维护工作,保持文档与代码的同步。

4. 数据验证与序列化

FastAPI 提供了强大的请求数据验证和响应数据序列化功能。通过类型提示,FastAPI 可以自动生成请求验证逻辑,确保传入的数据符合预期的格式。同时,FastAPI 也支持 Pydantic 模型,可以自动进行请求和响应体的序列化和反序列化,使得数据的处理更为方便。

5. 依赖注入系统

FastAPI 的依赖注入系统使得处理请求的逻辑更加模块化和可维护。通过声明依赖,可以将逻辑分解成小的、可测试的组件,提高代码的可读性和可维护性。

6. 安全性

FastAPI 内置了许多安全功能,包括对跨站点请求伪造(CSRF)的防护、对敏感信息的验证、密码哈希等。此外,通过 OAuth2 JWTJSON Web Tokens)的支持,可以轻松实现用户身份验证和授权。

7. WebSocket 支持

除了处理 HTTP 请求外,FastAPI 还支持 WebSocket,使得构建实时应用程序变得更加容易。WebSocket 是一种双向通信协议,适用于需要实时更新的应用,如即时聊天、实时数据推送等。

快速上手

1. 安装 FastAPI

使用 pip 安装 FastAPI:

pip install fastapi

2. 编写第一个 FastAPI 应用

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, query_param: str = None):
    return {"item_id": item_id, "query_param": query_param}

3. 运行应用

保存上述代码到 main.py 文件,然后运行以下命令:

uvicorn main:app --reload

详细解析

1. 异步支持

FastAPI 的异步支持基于 Python 的 asyncio 模块,可以通过 async def 定义异步函数,使用 await 关键字等待异步操作完成。这使得处理 I/O 密集型任务变得更加高效,例如数据库查询、网络请求等。

from fastapi import FastAPI

app = FastAPI()

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

@app.get("/async_endpoint")
async def async_endpoint():
    result = await some_async_function()
    return {"result": result}

2. 类型提示

FastAPI 利用类型提示提供了强大的自动文档生成和请求数据验证。通过类型提示,可以清晰地定义函数的输入和输出。

from fastapi import FastAPI

app = FastAPI()

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

在上述例子中,item_id 是一个整数,query_param 是一个可选的字符串。FastAPI 将根据这些信息自动生成文档,并在请求时验证传入的参数类型。

3. 自动生成文档

FastAPI 自动生成的文档使用 Swagger UI 和 ReDoc,通过访问 /docs/redoc 可以在浏览器中查看并测试 API。

Swagger UI 提供了一个交互式的 API 浏览界面,方便用户测试每个端点的功能。ReDoc 则提供了一个简洁、响应式的文档界面,适合移动设备和桌面浏览。

4. 数据验证与序列化

通过类型提示,FastAPI 自动生成了请求数据验证的逻辑,确保传入的数据符合预期的格式。同时,FastAPI 支持使用 Pydantic 模型进行更复杂的验证和序列化。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

@app.post("/items/")
async def create_item(item: Item):
    return item

在上述例子中,Item 是一个 Pydantic 模型,它定义了一个名为 item 的请求体,包含了 namedescriptionpricetax 等字段。FastAPI 将自动验证请求数据,并确保它符合 Item 模型的定义。

5. 依赖注入系统

FastAPI 的依赖注入系统使得处理请求的逻辑更加模块化和可维护。通过声明依赖,可以将逻辑分解成小的、可测试的组件。

from fastapi import FastAPI, Depends

app = FastAPI()

async def get_query_param(query_param: str = None):
    return query_param

@app.get("/items/")
async def read_item(query_param: str = Depends(get_query_param)):
    return {"query_param": query_param}

在上述例子中,get_query_param 是一个依赖函数,通过声明 Depends 将其注入到 read_item 函数中。这使得逻辑更加清晰,同时依赖可以被单独测试。

6. 安全性

FastAPI 内置了许多安全功能,例如对跨站点请求伪造(CSRF)的防护、对敏感信息的验证、密码哈希等。通过 OAuth2 和 JWT 的支持,可以轻松实现用户身份验证和授权。

from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    # 在这里执行验证 token 的逻辑,例如解析 JWT
    # 如果验证失败,抛出 credentials_exception 异常
    # 如果验证成功,返回用户信息
    return token

@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
    return {"username": current_user}

在上述例子中,get_current_user 函数通过 Depends 被注入到 read_users_me 函数中,实现了对用户身份的验证。如果验证失败,将抛出 HTTPException 异常,返回 401 未授权状态码。

7. WebSocket 支持

FastAPI 不仅支持处理 HTTP 请求,还提供了对 WebSocket 的原生支持。通过 WebSocket 类和 websocket_route 装饰器,可以轻松构建支持实时双向通信的应用。

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket_route("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message text was: {data}")

在上述例子中,websocket_endpoint 函数处理 WebSocket 连接,并在接收到消息时回传相同的消息。这使得构建实时聊天、实时数据推送等应用变得更加容易。

总结

FastAPI 是一个功能强大、易于使用的现代化 Python 后端框架,它通过异步支持、类型提示、自动生成文档等特性,使得开发高性能、可维护的 Web 应用变得更加简单。无论是构建 RESTful API 还是实现实时应用程序,FastAPI 都提供了丰富的功能和灵活的工具,成为 Python 后端开发的首选框架之一。通过学习和深入了解 FastAPI,你可以更加高效地构建出安全、可靠、高性能的 Web 应用。

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
PyTorch是一个开源的深度学习框架,它提供了丰富的工具和库,用于构建和训练神经网络模型。下面是对PyTorch框架的详细解释: 1. 动态计算图:PyTorch使用动态计算图的概念,这意味着在编写代码时可以实时定义和修改计算图。这种灵活性使得在模型训练过程中可以轻松地进行动态调整和调试。 2. 张量操作:PyTorch的核心是张量(Tensor),它是一种多维数组。PyTorch提供了丰富的张量操作,例如加法、减法、乘法、除法等,可以高效地进行数学运算。 3. 自动求导:PyTorch的自动求导功能使得在神经网络模型中计算梯度变得非常简单。通过将张量设置为需要进行梯度计算的变量,可以自动跟踪其上的操作并计算梯度。 4. 模型构建:PyTorch提供了一个灵活的方式来构建神经网络模型。可以通过继承nn.Module类来定义自己的模型,并重写forward函数来定义前向传播过程。 5. 预训练模型:PyTorch内置了一些常用的预训练模型,例如ResNet、VGG和BERT等。这些模型已经在大规模数据集上进行了预训练,并可以用于特定任务的微调或迁移学习。 6. 分布式训练:PyTorch支持在多个GPU和多台机器上进行分布式训练。通过使用torch.nn.DataParallel或torch.nn.parallel.DistributedDataParallel,可以轻松地实现模型的并行训练。 总之,PyTorch是一个功能强大且易于使用的深度学习框架,它提供了灵活的动态计算图、丰富的张量操作、自动求导功能以及方便的模型构建和训练工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦_天明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值