fastapi是python 3.10下构建轻量级restful api最省力的选择,它基于类型提示自动实现参数校验、openapi文档生成、异步支持和响应模型约束,而flask需手动处理这些环节;其强类型约束保障接口一致性,显著提升长期维护与团队协作效率。

用 Python 3.10 构建轻量级 RESTful API,FastAPI 是当前最直接、最省力的选择。Flask 虽然也能做,但需要手动处理校验、文档、异步、状态码等大量样板逻辑;而 FastAPI 基于类型提示自动生成验证、文档和错误响应,一行 async def 就能跑通一个带参数校验的接口——这不是“简化”,而是把重复劳动从开发流程里物理移除。
为什么不用 Flask + Flask-RESTful?
Flask 本身不强制 REST 风格,Flask-RESTful 扩展只解决路由组织问题,不提供:数据校验(得自己写 request.get_json() + if not xxx)、自动 OpenAPI 文档(需额外配 flasgger)、异步支持(原生阻塞,高并发下易卡死)、响应模型约束(返回字段无法静态校验)。这些在 FastAPI 里全是开箱即用的默认行为。
常见错误现象包括:
- 客户端传了空字符串给整型字段,Flask 返回 500 或静默转成 0,而 FastAPI 默认返回 422 并明确指出
age: value is not a valid integer - 忘记写
db.session.commit()导致数据没落库,却查不到错误日志(Flask-SQLAlchemy 默认不报错) - 用
jsonify()返回字典,但字段名大小写/嵌套结构随心情变化,前端调用方被迫写一堆兼容逻辑
用 FastAPI 启动一个带数据库的 API(SQLite)
核心是三件事:定义模型、声明路由、连接数据库。不需要 app.run(),也不用手动管理上下文。
安装依赖(推荐用 uv 加速):
curl -LsSf https://astral.sh/uv/install.sh | sh uv pip install fastapi uvicorn sqlalchemy databases[aiosqlite] httpx
创建 main.py:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from sqlalchemy import text
from databases import Database
<p>database = Database("sqlite:///./app.db")</p><p>class UserCreate(BaseModel):
name: str
age: int</p><p>app = FastAPI()</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6933" title="python-script-generator"><img
src="https://img.php.cn/upload/skill/000/000/081/179119443150703.jpg" alt="python-script-generator" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6933" title="python-script-generator" class="overflowclass">python-script-generator</a>
<p class="overflowclass">快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6933" title="python-script-generator" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>@app.on_event("startup")
async def startup():
await database.connect()</p><h1>初始化表(仅 SQLite 简单场景,生产请用 Alembic)</h1><pre class="brush:python;toolbar:false;">await database.execute(text("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
"""))@app.on_event("shutdown") async def shutdown(): await database.disconnect()
@app.post("/users") async def create_user(user: UserCreate): query = "INSERT INTO users (name, age) VALUES (:name, :age)" last_record_id = await database.execute(query, values=user.dict()) return {"id": last_record_id, **user.dict()}
运行命令:
uvicorn main:app --reload --host 0.0.0.0:8000
此时访问 http://localhost:8000/docs 就能看到自动生成的 Swagger UI,无需额外配置。
绕不开的几个坑:路径、参数、响应体必须对齐
FastAPI 的强约束性既是优势也是门槛。它要求你严格区分三类输入来源,混用就会报错:
-
Path参数:URL 中的变量,如/users/{user_id},必须用user_id: int显式声明类型,否则 422 -
Query参数:URL ? 后面的键值对,如?limit=10,要用limit: int = 10带默认值,否则必填 -
Body参数:POST/PUT 的 JSON,必须用Pydantic模型包裹,不能直接写dict或str
典型错误:
写成 def create_user(name: str, age: int) —— FastAPI 会尝试从 query 解析,但 POST 请求体里没这俩字段,直接 422;正确写法是封装进 UserCreate 模型,让框架自动从 body 提取。
另一个容易忽略的点:response_model 不只是装饰,它控制实际返回字段。比如数据库模型有 created_at 字段,但你不希望暴露给前端,就在路由上加 @app.get("/users", response_model=list[UserCreate]),它会自动过滤掉模型里未声明的字段。
真正麻烦的从来不是“怎么写第一个接口”,而是“怎么让第 100 个接口和第一个保持一致”。FastAPI 把一致性变成类型系统的一部分,而不是靠团队约定或 Code Review 来守住——这点在多人协作或长期维护时,价值远超启动速度。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










