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

FastAPI项目实战:用APIRouter快速搭建一个带用户和图书管理的小型API服务

FastAPI项目实战用APIRouter构建用户与图书管理API服务刚接触FastAPI时最让我惊艳的不是它的性能而是那种开箱即用的爽快感。上周接手一个需要快速原型验证的项目从零开始搭建用户和图书管理接口只用了一杯咖啡的时间就看到了Swagger文档页面——这要归功于APIRouter的模块化设计。本文将带你完整走一遍这个实战过程适合已经了解FastAPI基础但想掌握工程化实践的开发者。1. 项目初始化与环境配置在开始编码前合理的环境隔离是专业开发的第一个标志。我习惯为每个Python项目创建独立的虚拟环境这能避免依赖冲突的噩梦。打开终端执行以下命令python -m venv fastapi_env source fastapi_env/bin/activate # Linux/Mac fastapi_env\Scripts\activate # Windows接着安装核心依赖。除了fastapi和uvicorn我强烈推荐加上python-dotenv管理环境变量pip install fastapi uvicorn python-dotenv项目结构设计值得仔细考量。经过多个项目迭代我发现这种分层方式既清晰又易于扩展bookstore_api/ ├── .env ├── app/ │ ├── __init__.py │ ├── main.py │ └── routers/ │ ├── __init__.py │ ├── users.py │ └── books.py └── requirements.txt在main.py中初始化FastAPI应用时我习惯添加一些元数据配置这对生成的OpenAPI文档很友好from fastapi import FastAPI app FastAPI( title图书商城API, description用户与图书管理接口, version0.1.0, openapi_tags[{ name: users, description: 用户注册、登录及管理 },{ name: books, description: 图书信息管理 }] )2. 用户模块深度开发用户系统是大多数应用的基石。在routers/users.py中我们首先构建基础CRUD接口。注意APIRouter的prefix参数能自动为所有路由添加前缀from fastapi import APIRouter, HTTPException from pydantic import BaseModel router APIRouter(prefix/users, tags[users]) class User(BaseModel): username: str email: str | None None disabled: bool | None None fake_users_db { johndoe: User(usernamejohndoe, emailjohnexample.com), alice: User(usernamealice, emailaliceexample.com) } router.get(/) async def list_users(): return list(fake_users_db.values()) router.get(/{username}) async def get_user(username: str): if username not in fake_users_db: raise HTTPException(status_code404) return fake_users_db[username]实际项目中密码处理需要特别注意。以下是使用passlib处理密码哈希的推荐方式from passlib.context import CryptContext pwd_context CryptContext(schemes[bcrypt], deprecatedauto) def verify_password(plain_password, hashed_password): return pwd_context.verify(plain_password, hashed_password) def get_password_hash(password): return pwd_context.hash(password)用户认证通常会用到JWT这里展示如何在路由中添加安全依赖from fastapi.security import OAuth2PasswordBearer oauth2_scheme OAuth2PasswordBearer(tokenUrltoken) router.get(/me) async def read_current_user(token: str Depends(oauth2_scheme)): return {token: token}3. 图书模块进阶实现图书管理模块展示了更复杂的查询参数处理。在routers/books.py中from fastapi import APIRouter, Query from typing import Optional router APIRouter(prefix/books, tags[books]) fake_books_db [ {id: 1, title: Python进阶, author: 李雷}, {id: 2, title: FastAPI实战, author: 韩梅梅} ] router.get(/) async def list_books( page: int 1, size: int Query(default10, le100), author: Optional[str] None ): start (page - 1) * size end start size books fake_books_db[start:end] if author: books [b for b in books if b[author] author] return { data: books, pagination: { page: page, size: len(books), total: len(fake_books_db) } }对于创建操作使用Pydantic模型进行数据验证能省去大量if-else判断from pydantic import BaseModel, Field class BookCreate(BaseModel): title: str Field(..., min_length1, max_length100) author: str isbn: str Field(..., regex^[0-9\-]$) router.post(/) async def create_book(book: BookCreate): new_id max(b[id] for b in fake_books_db) 1 new_book {id: new_id, **book.dict()} fake_books_db.append(new_book) return new_book4. 路由集成与高级配置回到app/main.py整合路由时可以通过dependencies参数添加全局依赖from fastapi import Depends, FastAPI from fastapi.middleware.cors import CORSMiddleware from routers import books, users app FastAPI() # 跨域配置 app.add_middleware( CORSMiddleware, allow_origins[*], allow_methods[*], allow_headers[*], ) # 添加全局路由前缀 app.include_router(users.router, prefix/api/v1) app.include_router(books.router, prefix/api/v1)对于生产环境我通常会配置静态文件和自定义异常处理器from fastapi.staticfiles import StaticFiles from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app.mount(/static, StaticFiles(directorystatic), namestatic) app.exception_handler(RequestValidationError) async def validation_exception_handler(request, exc): return JSONResponse( status_code422, content{detail: exc.errors(), body: exc.body}, )5. 测试与部署优化使用TestClient编写自动化测试能极大提升开发效率from fastapi.testclient import TestClient from main import app client TestClient(app) def test_list_users(): response client.get(/api/v1/users/) assert response.status_code 200 assert len(response.json()) 0 def test_create_book(): test_data { title: 测试图书, author: 测试作者, isbn: 123-4567890123 } response client.post(/api/v1/books/, jsontest_data) assert response.status_code 200 assert response.json()[title] test_data[title]部署时uvicorn的配置参数对性能影响很大。这是我的常用生产配置uvicorn app.main:app \ --host 0.0.0.0 \ --port 8000 \ --workers 4 \ --limit-concurrency 100 \ --timeout-keep-alive 30对于需要更复杂路由组织的场景比如按功能域划分可以采用这种结构routers/ ├── auth/ │ ├── __init__.py │ ├── endpoints.py │ └── models.py ├── products/ │ ├── __init__.py │ └── endpoints.py └── __init__.py # 聚合所有子路由在大型项目中这种模式能让每个功能模块保持独立同时又能通过主路由统一管理。

相关文章:

FastAPI项目实战:用APIRouter快速搭建一个带用户和图书管理的小型API服务

FastAPI项目实战:用APIRouter构建用户与图书管理API服务 刚接触FastAPI时,最让我惊艳的不是它的性能,而是那种"开箱即用"的爽快感。上周接手一个需要快速原型验证的项目,从零开始搭建用户和图书管理接口,只…...

RHCE练习

练习: 1. 在4月份的周一到周三的上午11点执行 0 11 * 4 1-3 2. 每天早上7点到上午11点且每2小时执行一次 0 7-11/2 * * *3. 每天6点执行 0 6 * * * 4. 每周六凌晨4点执行 0 4 * * 65. 每周六凌晨4点05执行 5 4 * * 66. 每天8:40执行 40 8 * * *7. 在每天…...

glm-5-free不输付费版!DMXAPIAI模型聚合平台,如何调用免费大模型API?

中关村论坛发布AutoGLM 沉思智能体,具备深度研究与电脑操作双重能力,GLM-5.1 编程能力与全球顶尖模型 Claude Opus 4.6 差距仅2.6 分,整体呈现技术迭代、商业化与资本市场的全面提速态势。智谱AI正式推出GLM-5-free开源模型,凭借与…...

C++的std--ranges中的策略内联编译器

C的std::ranges中的策略内联编译器:高效编程的新利器 在现代C编程中,std::ranges库的引入为算法和范围操作带来了革命性的改进。其中,策略内联编译器作为其核心优化手段之一,能够显著提升代码执行效率。本文将深入探讨这一技术的…...

OpenClaw安全防护方案:Phi-3-mini-128k-instruct任务执行边界控制

OpenClaw安全防护方案:Phi-3-mini-128k-instruct任务执行边界控制 1. 为什么需要安全防护 当我第一次让OpenClaw接管本地电脑操作权限时,那种既兴奋又忐忑的心情至今记忆犹新。看着AI自动整理文件、发送邮件、执行脚本的同时,一个挥之不去的…...

低成本自动化方案:OpenClaw+自部署Gemma-3-12b-it替代SaaS API

低成本自动化方案:OpenClaw自部署Gemma-3-12b-it替代SaaS API 1. 为什么需要替代SaaS API? 去年我负责一个自动化内容处理项目时,遇到了一个典型困境:随着任务复杂度的提升,调用商业API的成本开始失控。一个包含网页…...

零基础玩转OpenClaw:Phi-3-mini-128k-instruct镜像云端体验

零基础玩转OpenClaw:Phi-3-mini-128k-instruct镜像云端体验 1. 为什么选择云端体验OpenClaw 作为一个长期关注AI自动化工具的技术爱好者,我一直在寻找一个既强大又易于上手的本地AI助手框架。OpenClaw的出现让我眼前一亮,但第一次尝试本地安…...

Go Routine 调度器的核心逻辑

Go语言凭借其轻量级线程——Goroutine,成为高并发编程的热门选择。而Goroutine的高效运行,离不开其底层调度器的精妙设计。本文将深入解析Goroutine调度器的核心逻辑,揭示其如何实现数万并发任务的流畅调度。调度模型:M-P-G三级协…...

OpenClaw浏览器插件开发:Qwen3-14b_int4_awq增强网页交互能力

OpenClaw浏览器插件开发:Qwen3-14b_int4_awq增强网页交互能力 1. 为什么需要浏览器插件与OpenClaw结合 作为一个长期与浏览器打交道的开发者,我经常遇到需要批量处理网页数据的场景。传统做法是写一堆油猴脚本或手动复制粘贴,直到发现OpenC…...

C++的std--ranges同步问题

C的std::ranges同步问题:现代C的并发挑战 随着C20引入std::ranges,开发者获得了更简洁、更强大的范围操作工具,但在多线程环境下,std::ranges的同步问题逐渐浮出水面。范围适配器、惰性求值和视图的组合虽然提升了代码的表达力&a…...

c++编程:说反话(1009-PAT乙级)

1009&#xff1a;说反话cin >> 读取字符串时不能读取空格string s; cin >> s; // 输入 "hello world" cout << s; // 输出 "hello"&#xff08;空格后面的被丢弃&#xff09;如何读取带空格的整行&#xff1f;getline()str…...

AI 模型推理自动化部署方案实践

AI模型推理自动化部署方案实践 随着人工智能技术的快速发展&#xff0c;AI模型的训练和推理已成为企业智能化转型的核心环节。模型从开发到生产环境的部署往往面临效率低、运维复杂等问题。自动化部署方案能够显著提升推理服务的稳定性和可扩展性&#xff0c;成为企业降本增效…...

c++编程:D进制的A+B(1022-PAT乙级)

1022. D进制的AB#include<bits/stdc.h> using namespace std; int main() { int A, B, D; // 定义三个整数变量 A、B 和进制 Dcin >> A >> B >> D; // 从标准输入读取 A、B、D 的值int sum A B; // 计算…...

Candleduino:面向MAB驱动器的跨平台CAN控制库

1. Candleduino库概述&#xff1a;面向MAB Robotics驱动器的跨平台CAN控制解决方案Candleduino是一个专为嵌入式平台设计的Arduino兼容C库&#xff0c;核心目标是实现对MAB Robotics公司MD系列伺服驱动器&#xff08;Motor Drive&#xff09;与PDS系列电源分配系统&#xff08;…...

MySQL主从延迟

技术文章大纲&#xff1a;MySQL主从延迟根因诊断法引言主从复制在MySQL高可用架构中的重要性主从延迟的常见影响&#xff08;数据不一致、查询延迟、故障恢复风险&#xff09;诊断延迟问题的必要性主从延迟的核心原理主从复制的基本流程&#xff08;binlog生成、传输、重放&…...

【设计模式】遍历集合的艺术:深入探索迭代器模式的无限可能

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

EnviroDIY_DS3231库详解:DS3231高精度RTC驱动与低功耗唤醒实践

1. EnviroDIY_DS3231 库深度解析&#xff1a;面向嵌入式数据采集系统的高精度RTC驱动实践1.1 库定位与工程价值EnviroDIY_DS3231 是一个专为 Arduino 生态设计的 DS3231 实时时钟&#xff08;RTC&#xff09;驱动库&#xff0c;其核心目标并非简单封装 IC 通信&#xff0c;而是…...

电商剪辑师慌了!AI1 小时出 50 条视频,易元 AI 帮工厂 / 品牌日更千条素材

电商剪辑师的“铁饭碗”正被AI打破&#xff01;当下电商流量竞争白热化&#xff0c;短视频是工厂、品牌获客转化的核心载体&#xff0c;日常上新、投流推广、社群分发等都需大量素材支撑。但传统人工剪辑低效高耗&#xff0c;3名专业剪辑师满负荷工作&#xff0c;日均产出不足1…...

RoPE → Attention 完整

好的&#xff0c;我帮你把之前的 “Transformer 输入 → RoPE → Attention” 全流程整理成一个完整的、连贯的文档。每一步都包含 数学表达 PyTorch 示例代码&#xff0c;方便直接参考或实现。Transformer 前向 RoPE 全流程1️⃣ 输入&#xff1a;Token → Embedding 数学表…...

OpenClaw备份策略:Qwen3-32B配置与技能库容灾方案

OpenClaw备份策略&#xff1a;Qwen3-32B配置与技能库容灾方案 1. 为什么需要备份OpenClaw环境 去年冬天的一个深夜&#xff0c;我的OpenClaw自动化脚本突然停止工作。经过排查发现是SSD故障导致~/.openclaw目录损坏&#xff0c;丢失了精心调校的模型配置、技能库和任务历史记…...

前端组件库吐槽:别再用那些华而不实的组件了!

前端组件库吐槽&#xff1a;别再用那些华而不实的组件了&#xff01; 毒舌时刻 前端组件库就像超市里的预制菜——看起来方便&#xff0c;实际吃起来味同嚼蜡。Ant Design、Material UI、Element Plus... 一堆组件库让你挑花了眼&#xff0c;结果你的页面还是丑得像车祸现场。…...

【RK3588 Mali610 适配 Qt6 】

主要适配RK3588 Mali610GPU 准备文件 准备文件 1、Qt6源码 2、必须安装的依赖文件 3、缺失的文件fbdev_window.h 其中第三项比较重要,关系到编译初期能够识别到GPU库。 fbdev_window.h内容如下: /** This confidential and proprietary software may be used only as* auth…...

当企业拥有了创新的 “上帝视角”,会发生什么?

当企业拥有了创新的 “上帝视角”&#xff0c;会发生什么&#xff1f;&#xff0d;&#xff0d;研企配 AI 大数据&#xff0c;打开中国企业产业洞察的上帝之窗在商业史上&#xff0c;所有的溃败都始于认知的闭环。14年前&#xff0c;诺基亚CEO约玛奥利拉在手机业务售出的发布会…...

PyDuinoBridge:Python与Arduino串口通信的变量级桥梁

1. PyDuinoBridge&#xff1a;嵌入式系统与Python协同开发的双向通信桥梁 PyDuinoBridge 是一个轻量级、透明、面向工程实践的串行通信中间件库&#xff0c;专为解决嵌入式微控制器&#xff08;以Arduino平台为代表&#xff09;与上位机Python环境之间高效、可靠、低侵入式数据…...

告别魔法!Gemini 3.1 Pro 国内稳定API使用教程(开发者+普通用户双版)

一、开篇&#xff1a;Gemini 3.1 Pro 到底强在哪&#xff1f; Gemini 3.1 Pro 推理能力直接翻倍&#xff0c;彻底解决了AI行业“快则不精、精则太贵”的痛点。 不管你是开发者想对接API&#xff0c;还是普通用户想低成本体验超强推理模型&#xff0c;这篇文章都给你一套清晰、…...

jcmd-jvm

jcmd 命令详解 什么是 jcmd jcmd 是 JDK 7 引入的一个命令行工具&#xff0c;用于向正在运行的 JVM 发送诊断命令。它是一个功能强大的工具&#xff0c;整合了之前多个 JVM 工具&#xff08;如 jstack、jinfo、jmap 等&#xff09;的功能&#xff0c;提供了统一的接口来管理和监…...

前端手写电子签系统实战:SVG为何是合同图片合成的最优解

一、前端手写电子签系统核心需求拆解 在开发手写电子签系统时&#xff0c;前端需满足以下核心业务与技术需求&#xff0c;这也是方案选型的核心依据&#xff1a; 高清无损&#xff1a;合同属于正式法律文件&#xff0c;签名、填写的字段文字需保证任意缩放、打印后均清晰无失真…...

# 系列文10:突破Activiti限制!政务工作流任意流转,支持跳退

系列文10&#xff1a;突破Activiti限制&#xff01;政务工作流任意流转&#xff0c;支持跳退回退 非科班野生程序员&#xff0c;深耕政务信息化20年&#xff0c;这套自研Java Web框架支撑过省级新农保、全国首例跨省医保结算等核心民生系统&#xff0c;18年稳定运行至今。本系…...

helm部署skywalking链路追踪 java

添加helm仓库 skywalking取别名 sw 名称可以任意写helm repo add sw https://apache.jfrog.io/artifactory/skywalking-helm helm repo list这里 sw 要与上面的 sw 名称 一样 从 Helm 仓库下载 SkyWalking 的 Chart 包&#xff0c;–untar 并自动解压到当前目录helm pull sw/s…...

EasyPreferences:ESP32类型安全的嵌入式配置管理库

1. EasyPreferences 库概述EasyPreferences 是专为 ESP32 平台设计的轻量级、类型安全的非易失性配置管理库。它并非对 ESP-IDFnvs_flash或 Arduino-ESP32PreferencesAPI 的简单封装&#xff0c;而是构建在其之上的抽象管理层&#xff0c;核心目标是解决嵌入式系统中长期存在的…...