技术分享FastAPIFlaskWeb框架

FastAPI vs Flask:我全都要!

2025/5/1010 min21 次观看

一个后端项目同时用FastAPI做API、Flask做管理后台,真实踩坑分享

01 艰难的选型

公司要做个短链服务,需要:

  • API接口:给前端和第三方调用
  • 管理后台:运营人员管理短链

我一开始就在FastAPI和Flask之间纠结。问了GPT,翻了文档,总结如下:

特性 FastAPI Flask
性能 高(ASGI异步) 中(WSGI同步)
生态 较新但增长快 非常成熟
数据验证 Pydantic内置 需额外库
API文档 自动Swagger 需手动
上手难度 中等

我的选择:两个都要!

  • FastAPI:高性能API服务
  • Flask:快速开发管理后台

02 FastAPI真香

先说FastAPI,用它写API真的太爽了:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field

app = FastAPI(title="短链API")

class UrlCreate(BaseModel):
    original_url: str = Field(..., min_length=1, max_length=2000)
    custom_code: str | None = Field(None, min_length=4, max_length=10)

@app.post("/api/shorten", response_model=dict)
async def create_short_url(data: UrlCreate):
    if data.custom_code in url_db:
        raise HTTPException(status_code=409, detail="短链码已存在")
    # 业务逻辑
    return {"code": "abc123", "short_url": "http://t.cn/abc123"}

优点

  • Pydantic自动验证参数,代码量少一半
  • 自动生成Swagger文档,接入方狂喜
  • 原生异步支持,性能杠杠的
  • 依赖注入机制太优雅了
from fastapi import Depends, Header

async def verify_token(x_token: str = Header(...)):
    if x_token != "secret":
        raise HTTPException(401, "Invalid token")
    return x_token

@app.get("/protected")
async def protected_route(token: str = Depends(verify_token)):
    return {"token": token}

03 Flask也很香

管理后台用Flask,原因是快——模板渲染太方便了:

from flask import Flask, render_template, Blueprint

app = Flask(__name__, template_folder="../templates")

@app.route("/admin/urls")
def url_list():
    urls = [
        {"code": "abc123", "original_url": "https://example.com", "visits": 42},
    ]
    return render_template("url_list.html", urls=urls)
<!-- templates/url_list.html -->
<table>
{% for url in urls %}
    <tr>
        <td>{{ url.code }}</td>
        <td>{{ url.original_url[:50] }}...</td>
        <td>{{ url.visits }}</td>
    </tr>
{% endfor %}
</table>

Flask的 Blueprint 很好用,路由拆分成独立文件:

# app/routes/urls.py
urls_bp = Blueprint("urls", __name__, url_prefix="/admin/urls")

@urls_bp.route("/")
def url_list():
    return render_template("url_list.html", urls=[])

# 注册
app.register_blueprint(urls_bp)

04 双服务启动

一个端口8000(FastAPI),一个端口5000(Flask),同时运行:

import threading
import uvicorn

def run_fastapi():
    uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)

def run_flask():
    from app.admin import app
    app.run(host="0.0.0.0", port=5000, use_reloader=False)

if __name__ == "__main__":
    t1 = threading.Thread(target=run_fastapi, daemon=True)
    t2 = threading.Thread(target=run_flask, daemon=True)
    t1.start()
    t2.start()
    print("API: http://localhost:8000/docs")
    print("后台: http://localhost:5000/admin/urls/")
    t1.join()

05 总结

  • API服务选FastAPI:高性能、自动文档、类型安全
  • 管理后台选Flask:模板渲染方便、快速开发
  • 小项目两个都用,各取所长不香吗?
© 2026 Helior. All rights reserved.
Built with Next.js