Python如何构建REST API?FastAPI框架快速入门

fastapi是构建高性能rest api的首选python框架,1.它基于类型提示和依赖注入实现代码清晰与自动文档生成;2.通过pydantic模型验证请求体数据;3.利用依赖注入系统复用公共逻辑;4.支持api key、oauth2等身份验证机制;5.可集成sqlalchemy等orm进行数据库操作;6.使用testclient配合pytest完成单元测试;7.可通过docker容器化并部署到云平台。该框架兼具高性能与开发效率,适用于现代api开发全流程,从定义路由到部署均提供完整解决方案。

Python如何构建REST API?FastAPI框架快速入门

构建REST API,Python提供了多种选择,但FastAPI无疑是近年来最受欢迎的框架之一。它以其高性能、易用性和自动化的文档生成能力脱颖而出。

解决方案

FastAPI的核心在于类型提示和依赖注入,这使得代码更加清晰、易于维护,并且能够自动生成OpenAPI和Swagger文档。以下是一个快速入门的示例:

立即学习“Python免费学习笔记(深入)”;

安装FastAPI和Uvicorn:

pip install fastapi uvicorn

Uvicorn是一个ASGI服务器,用于运行FastAPI应用。

创建

main.py

文件:

from fastapi import FastAPIapp = FastAPI()@app.get("/")async def read_root():    return {"Hello": "World"}@app.get("/items/{item_id}")async def read_item(item_id: int, q: str = None):    return {"item_id": item_id, "q": q}
FastAPI()

创建一个FastAPI应用实例。

@app.get("/")

定义一个GET请求的路由,路径为根目录

/

。

async def read_root()

定义一个异步函数,处理根目录的请求,返回一个JSON响应。

@app.get("/items/{item_id}")

定义一个GET请求的路由,路径为

/items/{item_id}

,其中

{item_id}

是一个路径参数。

item_id: int

使用类型提示,将

item_id

声明为整数类型。FastAPI会自动进行数据验证。

q: str = None

定义一个查询参数

q

,类型为字符串,默认值为

None

。

运行应用:

uvicorn main:app --reload
main:app

指定

main.py

文件中的

app

对象作为FastAPI应用。

--reload

启用自动重载,当代码发生更改时,服务器会自动重启。

访问API:

在浏览器中访问

http://127.0.0.1:8000/

,你将看到

{"Hello": "World"}

。访问

http://127.0.0.1:8000/items/123?q=test

,你将看到

{"item_id": 123, "q": "test"}

。

查看自动生成的文档:

访问

http://127.0.0.1:8000/docs

,你将看到Swagger UI,它会根据你的代码自动生成API文档。访问

http://127.0.0.1:8000/redoc

,你将看到ReDoc文档。

如何处理请求体?

FastAPI使用Pydantic模型来定义请求体。Pydantic是一个数据验证和设置管理库,它可以将Python类型转换为JSON模式,并自动验证请求数据。

from fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class Item(BaseModel):    name: str    description: str = None    price: float    tax: float = None@app.post("/items/")async def create_item(item: Item):    item_dict = item.dict()    if item.tax:        price_with_tax = item.price + item.tax        item_dict.update({"price_with_tax": price_with_tax})    return item_dict
class Item(BaseModel):

定义一个Pydantic模型,用于描述请求体的数据结构。

name: str

,

description: str = None

,

price: float

,

tax: float = None

定义模型的字段,并使用类型提示。

@app.post("/items/")

定义一个POST请求的路由,路径为

/items/

。

async def create_item(item: Item):

接收一个

Item

类型的参数,FastAPI会自动将请求体的数据转换为

Item

对象。

item.dict()

将

Item

对象转换为字典。

FastAPI的依赖注入如何工作?

Android 开发者指南 第一部分:入门 Android 开发者指南 第一部分:入门

Android文档-开发者指南-第一部分:入门-中英文对照版 Android提供了丰富的应用程序框架,它允许您在Java语言环境中构建移动设备的创新应用程序和游戏。在左侧导航中列出的文档提供了有关如何使用Android的各种API来构建应用程序的详细信息。第一部分:Introduction(入门) 0、Introduction to Android(引进到Android) 1、Application Fundamentals(应用程序基础) 2、Device Compatibility(设备兼容性) 3、

Android 开发者指南 第一部分:入门 11 查看详情 Android 开发者指南 第一部分:入门

FastAPI的依赖注入系统允许你将依赖项声明为函数参数。FastAPI会自动解析这些依赖项,并将它们传递给你的函数。这使得代码更加模块化、可测试和可重用。

from fastapi import FastAPI, Dependsapp = FastAPI()async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):    return {"q": q, "skip": skip, "limit": limit}@app.get("/items/")async def read_items(commons: dict = Depends(common_parameters)):    return commons@app.get("/users/")async def read_users(commons: dict = Depends(common_parameters)):    return commons
async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):

定义一个依赖项函数,它接收查询参数

q

、

skip

和

limit

。

commons: dict = Depends(common_parameters)

声明

commons

参数的依赖项为

common_parameters

函数。FastAPI会自动调用

common_parameters

函数,并将返回值传递给

read_items

函数。

read_items

和

read_users

函数都使用了相同的依赖项

common_parameters

,这避免了代码重复。

如何进行身份验证?

身份验证是REST API开发中的一个重要方面。FastAPI提供了多种身份验证方案,例如基于OAuth2的身份验证、基于JWT的身份验证等。

一个简单的API Key示例:

from fastapi import FastAPI, Depends, HTTPException, statusfrom fastapi.security import APIKeyHeaderapp = FastAPI()API_KEY = "your_secret_api_key"API_KEY_NAME = "X-API-Key"api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=False)async def get_api_key(api_key_header: str = Depends(api_key_header)):    if api_key_header == API_KEY:        return api_key_header    else:        raise HTTPException(            status_code=status.HTTP_401_UNAUTHORIZED,            detail="Invalid API Key",        )@app.get("/items/", dependencies=[Depends(get_api_key)])async def read_items():    return [{"item": "Foo"}, {"item": "Bar"}]
APIKeyHeader

定义了一个API Key头。

get_api_key

函数验证API Key是否正确。

dependencies=[Depends(get_api_key)]

将

get_api_key

函数作为

read_items

函数的依赖项。只有当API Key验证成功时,才能访问

read_items

函数。

如何处理数据库操作?

FastAPI可以与各种数据库集成,例如PostgreSQL、MySQL、MongoDB等。通常,可以使用ORM(对象关系映射)库来简化数据库操作,例如SQLAlchemy、Tortoise ORM等。

例如,使用SQLAlchemy:

from fastapi import FastAPI, Dependsfrom sqlalchemy import create_engine, Column, Integer, Stringfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmaker, SessionSQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"  # 使用SQLite,方便演示engine = create_engine(    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}  # 生产环境不推荐)SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)Base = declarative_base()class Item(Base):    __tablename__ = "items"    id = Column(Integer, primary_key=True, index=True)    name = Column(String, index=True)    description = Column(String, nullable=True)    price = Column(Integer)Base.metadata.create_all(bind=engine)app = FastAPI()def get_db():    db = SessionLocal()    try:        yield db    finally:        db.close()@app.post("/items/")async def create_item(name: str, description: str, price: int, db: Session = Depends(get_db)):    db_item = Item(name=name, description=description, price=price)    db.add(db_item)    db.commit()    db.refresh(db_item)    return db_item

定义数据库连接和模型。使用依赖注入获取数据库会话。进行数据库操作。

如何进行单元测试?

FastAPI的测试非常简单,可以使用

pytest

和

httpx

库进行单元测试。

from fastapi.testclient import TestClientfrom .main import app  # 假设你的FastAPI应用在main.py文件中client = TestClient(app)def test_read_main():    response = client.get("/")    assert response.status_code == 200    assert response.json() == {"Hello": "World"}def test_create_item():    response = client.post(        "/items/",        json={"name": "Test Item", "description": "A test item", "price": 10}    )    assert response.status_code == 200    assert response.json()["name"] == "Test Item"
TestClient

是一个用于测试FastAPI应用的客户端。使用

client.get()

和

client.post()

发送HTTP请求。使用

assert

语句验证响应状态码和内容。

如何部署FastAPI应用?

FastAPI应用可以部署到各种云平台和服务器上,例如Heroku、AWS、Google Cloud Platform等。通常,可以使用Docker容器化应用,然后部署到容器编排平台,例如Kubernetes。

一个简单的Dockerfile:

FROM python:3.9WORKDIR /appCOPY requirements.txt ./RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

指定基础镜像。设置工作目录。复制依赖项文件并安装。复制应用代码。运行Uvicorn服务器。

以上就是Python如何构建REST API?FastAPI框架快速入门的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/937863.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Informix在Linux上的集群解决方案
上一篇 2025年11月29日 16:27:31
如何在Linux中压缩目录文件 Linux tar打包压缩完整指南
下一篇 2025年11月29日 16:27:39

相关推荐

  • 豆包适配移动端吗 移动设备使用豆包的体验优化建议

    本文将围绕豆包在移动设备上的适配性展开讨论,并提供一系列优化使用体验的具体方法。文章会首先明确豆包对移动端的支持情况,然后通过分步讲解的形式,介绍如何在手机等设备上更高效地进行交互、输入和获取信息,帮助用户掌握提升操作流畅度的实用技巧。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限…

    2026年9月26日
    000
  • readdir在Debian中的安全性问题

    readdir 是 linux 系统中用于列出目录内容的函数,通常在 头文件中声明。在 debian(以及大多数 linux 发行版)中,readdir 函数本身并不直接引入额外的安全风险。然而,当它与系统其他部分结合使用时,可能会受到一些潜在的安全威胁。以下是一些相关的考虑点: 动态链接器劫持和 …

    2026年9月26日
    100
  • sublime怎么调试python代码_sublime配置Python调试环境教程

    sublime怎么调试python代码_sublime配置Python调试环境教程sublime怎么调试python代码_sublime配置Python调试环境教程sublime怎么调试python代码_sublime配置Python调试环境教程sublime怎么调试python代码_sublime配置Python调试环境教程

    配置Sublime Text的Python调试环境需安装SublimeREPL插件以运行交互式脚本,设置自定义Build System实现快捷运行输出,通过插入import pdb; pdb.set_trace()使用pdb进行简单断点调试,并可搭配Anaconda或LSP插件提升编码效率,适用于轻…

    2026年9月26日 • 用户投稿
    000
  • Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?

    Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?

    答案:Java 8的Stream API通过中间操作和终端操作实现惰性求值,提升性能与代码可读性。中间操作如filter、map返回新流且惰性执行,终端操作如forEach、collect触发计算并产生结果。惰性求值避免不必要的计算,支持短路操作,优化管道处理,适用于无限流。使用时需避免副作用、重复…

    2026年9月26日 • 用户投稿
    100
  • vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程

    vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程

    1、打开vivo浏览器进入目标网页,点击右上角三点菜单选择“添加到桌面”,系统自动创建快捷方式;2、若无此选项,可先将网页保存为书签,再通过书签管理长按条目选择“添加到桌面”生成图标;3、还可借助Nova Launcher等第三方启动器,通过添加网页链接小部件手动输入URL创建快捷方式。 如果您希望…

    2026年9月26日 • 用户投稿
    100
  • 新机遇、新体验、新服务,HarmonyOS 游戏领启未来

    新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来

    【中国,上海,2025年7月31日】2025年中国国际数字娱乐产业大会(cdec)高峰论坛顺利举行。华为终端云服务互动媒体bu总裁张思建在题为《技术赋能体验创新 harmonyos 游戏领启未来》的演讲中指出,随着harmonyos 5设备数量突破千万大关,鸿蒙系统5已成功通过大规模市场验证,整体用…

    2026年9月26日 • 用户投稿
    400
  • 率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元

    率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元

    在人工智能技术迅猛发展的背景下,从大规模模型训练到广泛的边缘计算应用,数据以前所未有的速度不断产生。根据 idc 的预测,至 2028 年全球将生成高达 394zb 的数据,其中生成式 ai 贡献超过 100zb。面对如此庞大的数据体量,如何实现安全存储与高效管理,成为亟需解决的关键问题。对于承载数…

    2026年9月26日 • 用户投稿
    100
  • 抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程

    抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程

    首先下载安装抖音直播伴侣,然后通过手机扫码登录,接着配置场景、音视频设备及推流参数,最后填写标题并点击“开始推流”即可成功开启电脑直播。 如果您想在电脑上进行直播,以获得更好的画面质量、音效控制和互动体验,但不清楚如何操作,可以按照以下步骤在抖音PC版开启直播。 本文运行环境:联想拯救者Y9000P…

    2026年9月26日 • 用户投稿
    100
  • 豆包AI是否能生成代码 豆包代码生成功能及其适用范围分析

    本文将围绕豆包AI是否能生成代码这一问题展开探讨。我们将首先确认其代码生成能力,随后详细讲解如何有效利用此功能,并通过步骤拆解,帮助用户掌握操作过程。最后,会分析该功能的适用场景与潜在局限,以便用户能更全面地理解和运用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Deep…

    2026年9月26日
    100
  • 优化VSCode远程SSH开发体验与高性能扩展加载方案

    通过优化SSH连接复用、按需加载扩展、预启动远程服务及本地协同调优,可显著提升VSCode远程开发体验。具体包括:配置ControlMaster实现连接共享,减少重复认证;使用高效加密算法加快传输;通过extensionKind分离本地与远程扩展,降低远程负载;设置VSCODE_AGENT_FOLD…

    2026年9月26日
    000
  • 如何利用Nginx日志进行安全监控

    如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控

    保障网站和应用安全,Nginx日志安全监控至关重要。本文将详细介绍关键步骤和最佳实践。 一、Nginx日志配置与启用 默认配置: Nginx通常已启用访问日志和错误日志记录。请确保日志文件配置正确并妥善存储。日志格式: 建议使用标准日志格式,方便后续分析。例如: log_format main ‘$…

    2026年9月26日 • 用户投稿
    000
  • 构建健壮的Java用户输入:Scanner整数解析与异常捕获

    构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获

    本文深入探讨了Java Scanner在获取整数输入时,当用户输入非整数数据可能引发的InputMismatchException。我们将解释此异常的产生机制,并提供一种健壮的解决方案:通过结合try-catch语句有效捕获并处理该异常,从而避免程序崩溃,提升用户交互的稳定性与友好性。 1. Jav…

    2026年9月26日 • 用户投稿
    000
  • 利好!TikTokShop欧洲市场入驻标准更新

    利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新

    近日,tiktokshop跨境电商针对欧洲市场释放利好信号!英国、西班牙、德国、意大利、法国欧洲五国跨境自运营(pop)模式,入驻标准更新及商家扶持新政策迎来官宣。 最新招商政策中,新商的调整核心在于,商家的第三方电商平台运营经验由【必填】调整为【选填】。同时,TikTokShop美区重点商家、有亚…

    2026年9月26日 • 用户投稿
    000
  • mysql中存储引擎对大数据量操作的适用性

    InnoDB是大数据量操作的首选存储引擎,支持事务、行级锁、外键及聚簇索引,适合高并发与大容量场景;MyISAM因表级锁和无事务支持,仅适用于读多写少的特定情况;配合分区、索引优化、读写分离等策略可进一步提升性能。 在MySQL中,存储引擎决定了数据的存储方式、读写机制以及索引结构,对大数据量操作的…

    2026年9月26日
    000
  • 怎么让豆包AI生成Python数据可视化代码

    怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码

    明确需求、指定图表类型和库、提供数据结构或示例,能高效让豆包ai生成python可视化代码。1. 先说明要画什么图,如“柱状图”;2. 指定用哪个库,如matplotlib或seaborn;3. 提供数据结构或部分数据;4. 检查生成代码是否完整,必要时补充导入语句或显示命令。 ☞☞☞AI 智能聊天…

    2026年9月26日 • 用户投稿
    000
  • 京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

    京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

    “网购时绑定新银行卡会不会被盗刷?””信用卡在平台消费是否存在风险?”随着京东等电商平台支付场景的不断拓展,用户对支付安全的关注度持续攀升。本文深入剖析京东新卡支付与信用卡支付的安全机制,用技术逻辑和平台规则消除你的顾虑。 一、京东新卡支付安全机制解析 1. 什么是京东新卡支付? 当用户首次在京东使…

    2026年9月26日 • 用户投稿
    000
  • Tomcat日志中常见的性能瓶颈是什么

    在tomcat日志中,常见的性能瓶颈主要包括以下几个方面: 线程数配置不当: 问题描述:Tomcat的线程数配置不合理可能导致请求堆积或线程资源浪费。如果线程数过少,可能无法处理高并发请求,导致请求延迟增加。相反,线程数过多可能导致频繁的上下文切换和资源竞争,影响性能。解决方法:根据服务器的硬件资源…

    2026年9月26日
    000
  • 《少林vs武当:传奇》上架Steam 暂不支持中文

    《少林vs武当:传奇》上架Steam 暂不支持中文《少林vs武当:传奇》上架Steam 暂不支持中文《少林vs武当:传奇》上架Steam 暂不支持中文《少林vs武当:传奇》上架Steam 暂不支持中文

    近日,格斗游戏新作《少林vs武当:传奇》(shaolin vs wutang legends)正式登陆steam平台,目前尚未公布具体发售时间,且暂未提供中文支持。 Steam商店页面:[点击前往](https://www.php.cn/link/b1a5a84a3388b3f37634445bd1…

    2026年9月26日 • 用户投稿
    000
  • 360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载失败可尝试关闭下载加速模块、调整IE安全设置、切换默认下载工具、更新浏览器或使用IDM等第三方工具解决。 如果您在使用360极速浏览器下载文件时,发现下载任务频繁中断或直接失败,可能是由于浏览器设置、网络环境或安全策略限制所致。以下是针对此问题的详细排查与解决方法。 本文运行环境…

    2026年9月26日 • 用户投稿
    200
  • 雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    要测试雷神 911 主机 m.2 接口的带宽性能,首先确认其支持的协议(pcie 或 sata)及规格,可查阅主板说明书或使用硬件检测工具;准备 m.2 ssd、最新驱动、windows 10/11 系统及测试软件如 crystaldiskmark 和 as ssd benchmark;运行测试并记…

    2026年9月26日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信