当前位置: 首页 > news >正文

FastAPI初学

文章目录

  • FastAPI、Starlette 和 Pydantic
    • 1. Starlette:一个高性能的 ASGI 框架
    • 2. Pydantic:数据验证和数据模型
    • 3. FastAPI:构建高性能的 Web API
    • 4. FastAPI、Starlette 和 Pydantic 的关系与区别
    • 5. 总结
  • 初始实践环节
    • 虚拟环境搭建和依赖安装
    • FastAPI CLI和开发模式参数
      • 开发模式
      • 生产模式
    • 详细参数介绍
      • 1. Arguments(参数)
      • 2. Options(选项)
      • 3. 总结
    • 简单代码运行体验

在这里插入图片描述

FastAPI、Starlette 和 Pydantic

  • FastAPI 是一个用于构建高性能 Web API 的 Python 框架,它基于 Starlette 和 Pydantic 两个库。FastAPI 旨在通过简单的语法和类型提示,提高开发人员的生产力,同时提供极高的性能。

  • 接下来,详细介绍 FastAPI、Starlette 和 Pydantic 这三者的关系和区别。

1. Starlette:一个高性能的 ASGI 框架

  • Starlette 是一个用于构建异步 Web 应用和服务的框架,它提供了许多 Web 应用程序所需的基础设施,比如路由、会话、WebSocket 支持、CORS(跨域资源共享)、请求和响应等。它是基于 ASGI(Asynchronous Server Gateway Interface) 规范的,这使得它能够处理异步请求,并且与传统的基于 WSGI(Web Server Gateway Interface)的框架相比具有更高的并发性和扩展性。

    • 异步支持:Starlette 允许通过异步请求处理来提高并发性能,这对于构建需要高吞吐量的 API 或 Web 应用至关重要。
    • 组件化:Starlette 提供了非常干净且模块化的组件,比如路由、请求、响应、CORS、认证等,可以根据需求进行灵活组合。
  • FastAPI 基于 Starlette 构建,意味着 FastAPI 本身继承Starlette 的异步处理能力和路由功能。可以直接使用 Starlette 的工具,比如 requestresponseWebSocket,在 FastAPI 中构建更加复杂的功能。

2. Pydantic:数据验证和数据模型

  • Pydantic 是一个用于数据验证和序列化的 Python 库。它通过 Python 的类型提示(type hints)来定义和验证数据模型,并且能自动处理一些常见的数据转换任务。

  • Pydantic 强调数据验证的准确性、效率和易用性,特别是在与 Web API 交互时,能够确保数据的有效性和完整性。

    • 类型安全:Pydantic 通过 Python 的类型提示来验证数据。比如,你可以定义一个类,指定属性的类型,并在数据传递时自动验证这些属性是否符合预期。
    • 数据转换:Pydantic 不仅验证数据的有效性,还能自动进行类型转换。比如,将字符串转换为日期类型,或将输入的数据转换为预期的格式。
    • 性能:Pydantic 被设计为高效的,它使用 Cython 和其他优化手段来提升数据验证的性能。
  • 在 FastAPI 中,Pydantic 主要用于数据的输入输出验证。例如,当接收 JSON 请求体时,FastAPI 会使用 Pydantic 模型来验证数据,并将其自动转换为 Python 对象。类似地,FastAPI 在返回响应时,也可以使用 Pydantic 模型将 Python 对象转换为 JSON 格式。

3. FastAPI:构建高性能的 Web API

  • FastAPI 是一个基于 Starlette 和 Pydantic 的 Web 框架,它不仅继承了 Starlette 的强大功能和异步支持,还结合了 Pydantic 的数据验证和类型提示功能。FastAPI 提供了一些额外的特性,旨在帮助开发人员高效地构建现代 Web API。
    • 自动文档生成:FastAPI 内置了 OpenAPI 和 JSON Schema 的支持,可以自动生成 API 文档。基于你的类型提示和 Pydantic 模型,FastAPI 会自动生成详细的 API 文档,使得前端开发者和 API 用户可以快速了解接口。
    • 类型提示:FastAPI 通过 Python 的类型提示来定义请求体、查询参数、路径参数等。这使得代码更加简洁、易读,同时也能通过 IDE 提供的自动补全和类型检查来提高开发效率。
    • 异步支持:通过继承自 Starlette,FastAPI 支持异步处理请求,这使得它非常适合处理高并发的场景。
    • 依赖注入系统:FastAPI 提供了一个强大的依赖注入系统,用于解耦业务逻辑、测试、数据库连接等功能。

4. FastAPI、Starlette 和 Pydantic 的关系与区别


  • 关系
  1. FastAPI 是构建在 StarlettePydantic 之上的框架。
    • Starlette 提供了 FastAPI 的路由和请求处理基础设施。
    • Pydantic 提供了 FastAPI 的数据验证和序列化功能。
  2. FastAPI 利用 Starlette 提供异步请求处理和响应功能,允许构建高并发的 Web 应用。
  3. FastAPI 使用 Pydantic 来验证 API 请求和响应的数据,确保数据的类型安全和有效性。

  • 区别
  • Starlette是一个 Web 框架,主要负责 HTTP 请求和响应的处理、路由功能、WebSocket 支持等基础设施。它是一个“轻量级”的框架,提供基础功能,允许开发人员构建 Web 应用和 API,但并不直接涉及数据验证或其他高级功能。

  • Pydantic是一个用于数据验证和序列化的库,专注于对输入数据进行验证、转换和处理。它与 FastAPI 紧密集成,成为 FastAPI 处理请求数据的核心工具,但它本身并不处理路由、请求、响应等 Web 开发功能。

  • FastAPI是一个综合性的 Web 框架,提供了路由、数据验证、自动文档生成等多种功能。它依赖于 Starlette 提供的 Web 功能和 Pydantic提供的数据验证功能,旨在为开发人员提供高效、易用的 API 开发体验。

5. 总结

  • FastAPI 通过结合 Starlette 的高性能异步处理能力和 Pydantic 的数据验证功能,打造了一个现代化、易用且高效的 Web API 框架。Starlette 主要负责 Web 请求的处理,而 Pydantic 主要关注数据的验证和转换,FastAPI 则将两者结合并提供了更丰富的功能,如自动生成文档、依赖注入等,帮助开发人员快速构建高质量的 API。

初始实践环节

虚拟环境搭建和依赖安装

conda create --name fastapi python=3.12
conda init
conda activate fastapi
pip install "fastapi[all]"
# 
pip install "uvicorn[standard]"

FastAPI CLI和开发模式参数

  • FastAPI CLI 是一个命令行程序,可用于启动FastAPI 应用程序、管理您的 FastAPI 项目等。

开发模式

  • 运行 fastapi dev 会启动开发模式,默认情况下,自动重载已启用,当更改代码时会自动重新加载服务器。这会消耗大量资源,并且可能不稳定。它还会监听 IP 地址127.0.0.1,这是您的机器与自身通信的 IP 地址 (localhost)。
  • 命令示例:fastapi dev main.py --port=8001
(fastapi) C:\Users\HP>fastapi dev --helpUsage: fastapi dev [OPTIONS] [PATH]Run a FastAPI app in development mode. 🧪This is equivalent to fastapi run but with reload enabled and listening on the 127.0.0.1 address.It automatically detects the Python module or package that needs to be imported based on the fileor directory path passed.If no path is passed, it tries with:- main.py- app.py- api.py- app/main.py- app/app.py- app/api.pyIt also detects the directory that needs to be added to the PYTHONPATH to make the app importableand adds it.It detects the FastAPI app object to use. By default it looks in the module or package for anobject named:- app- apiOtherwise, it uses the first FastAPI app found in the imported module or package.╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
│   path      [PATH]  A path to a Python file or package directory (with __init__.py files)        │
│                     containing a FastAPI app. If not provided, a default set of paths will be    │
│                     tried.                                                                       │
│                     [default: None]                                                              │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
│ --host                                   TEXT     The host to serve on. For local development in │
│                                                   localhost use 127.0.0.1. To enable public      │
│                                                   access, e.g. in a container, use all the IP    │
│                                                   addresses available with 0.0.0.0.              │
│                                                   [default: 127.0.0.1]                           │
│ --port                                   INTEGER  The port to serve on. You would normally have  │
│                                                   a termination proxy on top (another program)   │
│                                                   handling HTTPS on port 443 and HTTP on port    │
│                                                   80, transferring the communication to your     │
│                                                   app.                                           │
│                                                   [default: 8000]                                │
│ --reload           --no-reload                    Enable auto-reload of the server when (code)   │
│                                                   files change. This is resource intensive, use  │
│                                                   it only during development.                    │
│                                                   [default: reload]                              │
│ --root-path                              TEXT     The root path is used to tell your app that it │
│                                                   is being served to the outside world with some │
│                                                   path prefix set up in some termination proxy   │
│                                                   or similar.                                    │
│ --app                                    TEXT     The name of the variable that contains the     │
│                                                   FastAPI app in the imported module or package. │
│                                                   If not provided, it is detected automatically. │
│                                                   [default: None]                                │
│ --proxy-headers    --no-proxy-headers             Enable/Disable X-Forwarded-Proto,              │
│                                                   X-Forwarded-For, X-Forwarded-Port to populate  │
│                                                   remote address info.                           │
│                                                   [default: proxy-headers]                       │
│ --help                                            Show this message and exit.                    │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯

生产模式

  • 默认情况下,执行fastapi run会以生产模式启动 FastAPI。
  • 默认情况下,自动重载已禁用。它会监听 IP 地址 0.0.0.0,允许公开访问,供任何可以与机器通信的人使用。
(fastapi) PS C:\Users\HP> fastapi run --helpUsage: fastapi run [OPTIONS] [PATH]Run a FastAPI app in production mode. 🚀This is equivalent to fastapi dev but with reload disabled and listening on the 0.0.0.0 address.It automatically detects the Python module or package that needs to be imported based on the fileor directory path passed.If no path is passed, it tries with:- main.py- app.py- api.py- app/main.py- app/app.py- app/api.pyIt also detects the directory that needs to be added to the PYTHONPATH to make the app importableand adds it.It detects the FastAPI app object to use. By default it looks in the module or package for anobject named:- app- apiOtherwise, it uses the first FastAPI app found in the imported module or package.╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
│   path      [PATH]  A path to a Python file or package directory (with __init__.py files)        │
│                     containing a FastAPI app. If not provided, a default set of paths will be    │
│                     tried.                                                                       │
│                     [default: None]                                                              │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
│ --host                                   TEXT     The host to serve on. For local development in │
│                                                   localhost use 127.0.0.1. To enable public      │
│                                                   access, e.g. in a container, use all the IP    │
│                                                   addresses available with 0.0.0.0.              │
│                                                   [default: 0.0.0.0]                             │
│ --port                                   INTEGER  The port to serve on. You would normally have  │
│                                                   a termination proxy on top (another program)   │
│                                                   handling HTTPS on port 443 and HTTP on port    │
│                                                   80, transferring the communication to your     │
│                                                   app.                                           │
│                                                   [default: 8000]                                │
│ --reload           --no-reload                    Enable auto-reload of the server when (code)   │
│                                                   files change. This is resource intensive, use  │
│                                                   it only during development.                    │
│                                                   [default: no-reload]                           │
│ --workers                                INTEGER  Use multiple worker processes. Mutually        │
│                                                   exclusive with the --reload flag.              │
│                                                   [default: None]                                │
│ --root-path                              TEXT     The root path is used to tell your app that it │
│                                                   is being served to the outside world with some │
│                                                   path prefix set up in some termination proxy   │
│                                                   or similar.                                    │
│ --app                                    TEXT     The name of the variable that contains the     │
│                                                   FastAPI app in the imported module or package. │
│                                                   If not provided, it is detected automatically. │
│                                                   [default: None]                                │
│ --proxy-headers    --no-proxy-headers             Enable/Disable X-Forwarded-Proto,              │
│                                                   X-Forwarded-For, X-Forwarded-Port to populate  │
│                                                   remote address info.                           │
│                                                   [default: proxy-headers]                       │
│ --help                                            Show this message and exit.                    │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯

详细参数介绍

1. Arguments(参数)

  • path
    • 描述:指定FastAPI应用程序的Python文件或包的路径。如果没有提供路径,默认会尝试以下路径(例如main.py, app.py等)。路径可以是文件或包含__init__.py的包目录。
    • 默认值None,即如果没有提供路径,fastapi会根据默认的路径列表进行尝试。

2. Options(选项)

  • –host

    • 描述:指定服务器要绑定的主机(即IP地址)。
    • 默认值0.0.0.0,这意味着应用将会监听所有可用的网络接口,适用于生产环境中需要外部访问的情况。
    • 常用值
      • 127.0.0.1:仅限本地访问(用于开发时)。
      • 0.0.0.0:允许公共访问(适用于容器中运行的情况)。
  • –port

    • 描述:指定服务器要监听的端口号。常用于指定HTTP或HTTPS服务的端口。
    • 默认值8000,这是FastAPI默认的端口。
    • 备注:通常会在前面配置一个代理服务器处理HTTPS请求,例如通过NGINX或反向代理进行流量转发。
  • –reload / –no-reload

    • 描述:启用或禁用代码自动重载。启用后,当应用的代码文件发生变化时,服务器会自动重新加载应用,这对开发过程中调试非常有用。
    • 默认值no-reload,意味着默认不启用自动重载。
    • 注意:开启此选项时可能会导致较高的资源消耗,因此仅建议在开发过程中使用。
  • –workers

    • 描述:指定使用的工作进程数。这个选项允许您使用多个工作进程来处理请求,可以提高应用的并发处理能力。
    • 默认值None,即默认不使用多个工作进程。
    • 说明:与--reload选项互斥,开启--workers时不能同时使用--reload
  • –root-path

    • 描述:设置根路径,通常用于应用部署在带有路径前缀的情况下。例如,如果代理服务器将请求的路径前缀添加到URL中,您可以通过此选项指定根路径来正确解析请求。
    • 用途:当应用部署在带有前缀的环境中时,如/myapp,可以通过该选项告知FastAPI正确的路径前缀。
  • –app

    • 描述:指定包含FastAPI应用实例的变量名称。FastAPI会根据提供的路径自动检测应用实例,默认情况下会查找名为appapi的变量。
    • 默认值None,意味着如果没有指定,FastAPI会自动检测并使用应用实例。
  • –proxy-headers / –no-proxy-headers

    • 描述:启用或禁用使用代理服务器传递的HTTP头信息(如X-Forwarded-ProtoX-Forwarded-ForX-Forwarded-Port)来填充请求中的远程地址信息。
    • 默认值proxy-headers,即默认启用代理头信息。
    • 说明:在应用后端有反向代理或负载均衡器的情况下,启用此选项可以确保应用正确识别客户端的真实IP和协议。
  • –help

    • 描述:显示帮助信息并退出。

3. 总结

  • fastapi run命令用于在生产模式下运行FastAPI应用程序,默认配置适用于广泛的生产环境。
  • 通过设置主机(--host)和端口(--port),可以灵活配置服务器的绑定地址和端口。
  • 开发模式下,可以启用自动重载(--reload)来提升开发效率,但这会增加资源消耗。
  • 支持配置工作进程数(--workers)以多个工作进程来处理请求,可以提高应用的并发处理能力。

简单代码运行体验

  • start.py
from fastapi import FastAPIapp = FastAPI()a = 0@app.get("/")
async def read_root():return {"Hello": "World"}@app.get("/shop")
async def get_shop():return {"info": "可乐"}@app.get("/num")
async def get_num():global a  # 使用global声明变量aa += 1return {"info": a}
fastapi dev start.py

在这里插入图片描述

http://www.lryc.cn/news/626489.html

相关文章:

  • 《深度解析PerformanceObserverAPI: 精准捕获FID与CLS的底层逻辑与实践指南》
  • 【STM32】HAL库中的实现(六):DAC (数模转换)
  • 调用海康威视AI开放平台接口实现人体关键点检测
  • Java毕业设计选题推荐 |基于SpringBoot+Vue的知识产权管理系统设计与实现
  • langchain-ds的报告生成提示词
  • 结构化 OCR 技术:破解各类检测报告信息提取难题
  • Objective-C 版本的 LiveEventBus 效果
  • java和javascript在浮点数计算时的差异
  • Flink实现Exactly-Once语义的完整技术分解
  • mac 搭建docker-compose,部署docker应用
  • Android 入门到实战(三):ViewPager及ViewPager2多页面布局
  • linux内核 - 内存管理单元(MMU)与地址翻译(二)
  • 0820 SQlite与c语言的结合
  • Mac编译Android AOSP
  • 【密码学实战】X86、ARM、RISC-V 全量指令集与密码加速技术全景解析
  • deque的原理与实现(了解即可)
  • HTML5中秋网站源码
  • 基于RK3568储能EMU,储能协调控制器解决方案
  • 生产电路板的公司有哪些?国内生产电路板的公司
  • MySQL 8.x的性能优化文档整理
  • RK3576赋能无人机巡检:多路视频+AI识别引领智能化变革
  • 【38页PPT】关于5G智慧园区整体解决方案(附下载方式)
  • 无人机图传 便携式5G单兵图传 HDMI图传设备 多卡5G单兵图传设备详解
  • 元宇宙的网络基础设施:5G 与 6G 的关键作用
  • 计算机视觉(二)------OpenCV图像视频操作进阶:从原理到实战
  • WIFI国家码修改信道方法_高通平台
  • 开发避坑指南(29):微信昵称特殊字符存储异常修复方案
  • 多模型创意视频生成平台
  • 微美全息(NASDAQ:WIMI):以区块链+云计算混合架构,引领数据交易营销科技新潮流
  • Linux: network: arp: arp_accept