惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Application and Cybersecurity Blog
Application and Cybersecurity Blog
月光博客
月光博客
Y
Y Combinator Blog
P
Proofpoint News Feed
Forbes - Security
Forbes - Security
美团技术团队
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
T
Tor Project blog
T
The Blog of Author Tim Ferriss
C
CERT Recently Published Vulnerability Notes
U
Unit 42
人人都是产品经理
人人都是产品经理
V2EX - 技术
V2EX - 技术
L
Lohrmann on Cybersecurity
罗磊的独立博客
博客园 - 聂微东
C
Cybersecurity and Infrastructure Security Agency CISA
N
News and Events Feed by Topic
大猫的无限游戏
大猫的无限游戏
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Help Net Security
Security Archives - TechRepublic
Security Archives - TechRepublic
Microsoft Azure Blog
Microsoft Azure Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
P
Privacy International News Feed
爱范儿
爱范儿
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
The Cloudflare Blog
T
Threat Research - Cisco Blogs
云风的 BLOG
云风的 BLOG
F
Full Disclosure
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hugging Face - Blog
Hugging Face - Blog
T
Tenable Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hacker News: Ask HN
Hacker News: Ask HN
TaoSecurity Blog
TaoSecurity Blog
B
Blog RSS Feed
Google Online Security Blog
Google Online Security Blog
D
Docker
Martin Fowler
Martin Fowler
I
Intezer
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security Affairs
T
Tailwind CSS Blog
IT之家
IT之家

博客园 - 一名程序媛呀

Uvicorn、Gunicorn 傻傻分不清?FastAPI 生产部署避坑指南 Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招! 刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API 别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了 掏出手机就能搭个 WebDAV 同步服务器?这操作有点香 别只盯着GitBook了!这个文档神器让你的笔记秒变网站 写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了 FastAPI 身份验证总踩坑?这份 FastAPI Users “避坑指南”请收好 旧手机别扔!用 Termux 搭个私人云盘,比网盘香多了 你的FastAPI又在服务器上“跑不起来”了?来,今天咱把打包这件事彻底聊透 写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了 前端包管理咋选?我从npm叛逃到pnpm的血泪史(附避坑指南) 聊聊 fetch 使用中我踩过的那些坑和正确打开方式 FastApiAdmin 后端接口开发好了,前端管理界面怎么调用与显示? 给 FastApiAdmin 加个“会议纪要”模块,我把后端二次开发的坑踩了个遍 我用了FastApiAdmin后,连夜把踩过的坑都整理出来了 告别 Typora 后的新欢:我把所有笔记迁移到了 Obsidian 这个“第二大脑” 你的Agent API还在裸奔?从认证到沙箱,我用FastAPI搭了几道防线 让 FastAPI Agent 思考不阻塞:手把手教你实现异步任务与后台处理方案 让FastAPI Agent真正记住你:聊聊会话记忆与持久化存储的落地实践 FastAPI Agent 函数调用实战:我让 AI 学会了“自己动手查天气“ 初探:用 FastAPI 搭建你的第一个 AI Agent 接口 FastAPI 少有人提的实用技巧:把 Depends 依赖提到路由层,代码少写60% FastAPI 生产环境静态文件完全指南:从 /favicon.ico 404 到 HSTS 混合内容,一次全根治 用了loguru我才明白,Python日志还能这么写 FastAPI 后台任务:BackgroundTasks 的使用场景与注意事项 FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚 FastAPI 文件上传避坑全指南:分块存盘、类型校验与安全兜底 FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上 FastAPI + SQLAlchemy 2.0 通用CRUD操作手册 —— 从同步到异步,一次讲透 FastAPI订单防超卖实战:从数据库锁到Saga分布式事务,这一篇给你理清了 FastAPI 生产环境避坑指南:用 Alembic 管理数据库迁移,别再手动改表结构了! FastAPI服务半夜又挂了?先别急着重启,查查你的数据库连接池“池子”是不是漏了 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 Vue 3 组合式 API 香是香,但从Vue2迁移时你可别像我当初一样踩进这 3 个深坑里 我用fastapi-scaff搭了个项目,两天工期缩到两小时,老板以为我开挂了 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! FastAPI自动生成的API文档太丑?我花了一晚上把它改成了客户愿意付费的样子 告别手写 API 胶水代码:FastAPI 与 Vue 的“契约自动机” OpenAPI 实战 FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南” FastAPI + Celery 实战:异步任务里调用 Redis 和数据库的全解析,及生产级组织方案 FastAPI里玩转Redis和数据库的正确姿势,别让异步任务把你坑哭了! FastAPI + Celery 实战:异步任务的坑与解法,我帮你踩了一遍 FastAPI子应用挂载:别再让root_path坑你一夜 FastAPI项目半夜报警吵醒你?聊聊告警这事儿怎么搞! 别再数据线了!用FastAPI 5分钟搭个局域网文件+剪贴板神器 FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香! FastAPI状态共享秘籍:别再让中间件、依赖和路由“各自为政”了! FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了! 从0到1,FastAPI + PostgreSQL + Tortoise ORM 实战避坑指南 FastAPI + PostgreSQL 实战:给应用装上“缓存”和“日志”翅膀 FastAPI + PostgreSQL 实战:从入门到不踩坑,一次讲透
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
一名程序媛呀 · 2026-06-29 · via 博客园 - 一名程序媛呀

💡 文章摘要
还在为REST接口数据冗余或不足、频繁改接口而加班吗?本文带你深入浅出地理解GraphQL的核心原理,手把手演示FastAPIStrawberry的最佳组合实践。
从环境搭建到解决N+1查询、跨域等深坑,用最口语化的方式,帮你一次性掌握这款让前后端不再“撕逼”的效率神器。看完就能直接上手,告别无意义的字段冗余。

📱 想写REST接口,却总在前后端联调时被“字段给少了”或“数据量爆炸”这种事逼疯?

📱 每次改需求都要后端重新开接口,加班加到想删库跑路?

👩‍💻我是爱折腾的一名程序媛,喜欢研究全栈开发的各种实践,热爱分享踩坑后的收获与思考,也享受用代码写出各种实用小工具解决问题的快乐。

如果你也在技术这条路上向前走,关注我,愿我们能彼此陪伴,一起成为更好的自己 🌱

今天咱们不聊那些虚无缥缈的架构玄学,就蹲下来,像修自行车一样,把 GraphQL 这个看着高大上的东西拆开看看。

📝 【本文核心解决什么问题?】

这篇文章不会让你变成GraphQL的“原教旨主义者”。

咱们的目标很纯粹:用最快的速度,搞懂这个“让前端舒服、让后端解脱”的玩意儿到底是什么,怎么在 FastAPI 里把它玩起来,以及那些官方文档里没写的、我自己摔得鼻青脸肿才摸清的坑。

🗺️ 【主要内容脉络】

🔹 GraphQL到底是什么?为啥它不是“银弹”却很好用?

🔹 FastAPI + GraphQL 的神仙组合环境怎么搭?

🔹 从写第一行查询到跑通增删改查的实战代码。

🔹 那些让你在深夜抓狂的跨域、性能、N+1查询问题,怎么优雅解决?

🤔 【第一部分:那个被“字段冗余”逼疯的下午】

你一定经历过这种绝望:
产品经理说,首页这里只想要用户的头像和昵称。你打开那个经典的 GET /api/user/info 接口,好家伙,它返回了用户的注册时间、手机号、身份证、最近30条登录日志,甚至还有星座运势。整整2MB的JSON。

这就是传统REST的“过载”和“不足”。
接口是后端写死的,你想要筛字段?不好意思,改后端代码;
你想把两个接口的数据拼一起?前端老老实实等接口重写。

这个时候,GraphQL 就像一个懂事的食堂阿姨:“姑娘,想吃什么打什么,按需所取,别浪费。”

核心观点
GraphQL 不是数据库,它是一门给API设计的查询语言。你只需要发一个请求,告诉后端你要什么形状的数据,它就能精准地把拼盘端给你,一个字节都不多。

🛠️ 【第二部分:FastAPI + GraphQL 的绝佳组合】

我必须要安利一下 Strawberry 这个库。虽然 Graphene 也是老牌选手,但 Strawberry 基于 Python 的 dataclass,那种原生感、顺滑感,就像给FastAPI这辆超跑装上了精确制导系统。顺手的工具才是最好的!

好,咱们先来搭环境:

pip install fastapi[standard] strawberry-graphql

这里有一点要特别注意,一定要确认 Strawberry 的版本和你的 FastAPI 兼容,虽然官方文档说向下兼容,但根据以往的经验,大版本升级时,装饰器的引入路径可能会微调,别问我怎么知道的,说多了都是泪。

接下来,定义一个“菜单”,也就是 Schema。咱们拿用户来举例:

import strawberry

from typing import List

# 定义一个类型,告诉 GraphQL 你的菜长什么样

@strawberry.type

class User:

    idint

    name: str

    age: int

# 这就是后厨,负责做菜(提供数据)

def get_users_from_db():

    # 假装这里在查数据库

    return [

        User(id=1, name="程序媛一号", age=18),

        User(id=2, name="程序媛二号", age=20),

    ]

# 根查询,客人一进门就看到的地方

@strawberry.type

class Query:

    @strawberry.field

    def users(self) -> List[User]:

        return get_users_from_db()

# 把菜单挂到 FastAPI 上

schema = strawberry.Schema(query=Query)

是不是以为这样就Ok了?还没完呢,得把路由挂上去

from fastapi import FastAPI

from strawberry.fastapi import GraphQLRouter

app = FastAPI()

graphql_app = GraphQLRouter(schema)

app.include_router(graphql_app, prefix="/graphql")

此时你运行起来,访问 http://localhost:8000/graphql,就能看到一个酷炫的内置调试器。在这里,你可以像点菜一样写:

query {

  users {

    name

  }

}

看到了吧?就算你的数据库里用户对象有 idage,因为你没在查询里写,它就绝不给你多传。
前端再也没办法因为“字段多了”骂后端了,后端也不用因为“切视图”加班了。

⚔️ 【第三部分:实战演示,加点戏】

光说不练假把式,咱们加点“辣”的——修改和提交数据(Mutation)

@strawberry.type

class Mutation:

    @strawberry.mutation

    def add_user(self, name: str, age: int) -> User:

        # 这里应该有入库逻辑,但为了演示,直接返回

        new_user = User(id=999, name=name, age=age)

        return new_user

# 别忘了把 Mutation 也塞进 Schema

schema = strawberry.Schema(query=Query, mutation=Mutation)

你可能会问:“这就完了?参数校验呢?”

问得好!Strawberry 的类型系统本身就是校验
如果前端传过来的 age 是个字符串,GraphQL 直接在解析阶段就报错挡回去了,根本不会进你的业务逻辑。这就为后端省下了一大堆手写 if not isinstance 的破事。

再说个容易翻车的点:N+1 查询问题
如果你有一个 User 类型,里面嵌套了他的文章列表 posts。如果直接循环查数据库,查100个用户就会触发出101条SQL,服务瞬间变龟速。
这里一定要用 DataLoader 来批处理请求。这是 GraphQL 进阶的保命技能,切记切记。

💡 【第四部分:注意事项与最后啰嗦几句】

跨域配置(CORS)

前后端分离,浏览器报跨域是常有的事。咱们 FastAPI 出手,必须稳准狠:

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(

    CORSMiddleware,

    allow_origins=["*"],

    allow_methods=["*"],

    allow_headers=["*"],

)

上线前,记得把星号换成你的实际域名,这是底线。

不要用 GraphQL 做所有事

如果是极度简单的、不需要灵活字段的接口(比如登录验证),继续用 REST 风格的 FastAPI 路由反而更简单。千万别手里拿个锤子,看啥都是钉子。

监控复杂性

GraphQL 给了前端太大的权利,如果前端写出一个深不见底的嵌套查询,服务器可能会挂。所以一定要做查询深度限制和时间超时控制。

✨ 【总结】

从“给多给少”的撕逼,到“要啥给啥”的默契,GraphQL 改变的不仅仅是数据传输的方式,更是前后端协作的心智模型。
配合 FastAPI 的高性能异步特性,这组搭档可以说是现代 Web 开发的效率神器。


今天咱们聊的,都是实实在在能跑起来、能避免加班的东西。技术这条路,一个人闷头走总是容易掉坑里,我希望当你的“避坑指南”,让你少走弯路。

觉得有收获的话,就点赞收藏加个关注吧!下一次咱们聊的话题可能就是你最关心的哦!