Python Web开发:从Flask到FastAPI,我经历了什么

Python做Web后端,框架选择一直是个热门话题。从最早的Django一统天下,到Flask的轻量灵活,再到FastAPI的异军突起,每个框架都有自己的拥趸。这篇文章不吹不黑,说说我用这几个框架的真实感受,以及什么项目该选什么框架

一、Django:大而全的工业级框架

Django是我入行用的第一个Web框架。它的口号是"为完美主义者打造的Web框架",特点是功能极其全面

Django的优点

开箱即用:Django自带的东西太多了------ORM、Admin后台、表单验证、用户认证、Session管理、模板引擎、中间件......你几乎不需要自己选型,拿来就能用。

python

复制代码
# Django的ORM使用
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey('User', on_delete=models.CASCADE)

# 查询语法非常直观
articles = Article.objects.filter(author__username='zhangsan').order_by('-pub_date')

Admin后台:这是Django的杀手锏。只需要定义好Model,一个功能完整的管理后台就自动生成了。对内部管理系统来说,这简直是神器。

python

复制代码
# admin.py
from django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'pub_date')
    search_fields = ('title', 'content')
    list_filter = ('pub_date', 'author')

安全性:Django内置了XSS、CSRF、SQL注入等防护,开箱即安全。

成熟生态:第三方包极其丰富------django-rest-framework、django-celery、django-debug-toolbar......遇到问题搜一下,基本都有答案。

Django的缺点

:Django太重了。一个最简单的项目也要加载一大堆东西,启动慢,内存占用高。不适合微服务或者资源受限的场景。

不灵活:Django有自己的一套哲学,你最好按它的方式来。如果你想用SQLAlchemy替代Django的ORM,那几乎是在跟框架作对。

同步阻塞:Django默认是同步的,虽然支持异步(3.0+),但生态还不成熟。

适合的场景
  • 内容管理系统(CMS)

  • 企业级后台管理系统

  • 博客、新闻网站

  • 需要快速开发MVP的项目

  • 团队成员大多是Django老手的团队

二、Flask:小而精的灵活框架

Django用了一段时间后,我开始觉得它太笨重了。一个简单的API服务,Django要加载一堆用不上的东西。于是我开始尝试Flask。

Flask的核心哲学是微内核------它只提供最基础的功能(路由、请求、响应),其他的由你选择。

Flask的优点

轻量:Flask的源码非常精简,核心只有几千行。启动飞快,内存占用小。

灵活:想用SQLAlchemy就用SQLAlchemy,想用peewee就用peewee,想用原生SQL也行。Flask从不强迫你用什么。

python

复制代码
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)

@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = User.query.get(user_id)
    if user is None:
        return jsonify({'error': 'User not found'}), 404
    return jsonify(user.to_dict())

易学:Flask的设计非常简洁,新手半小时就能上手。路由和视图函数的写法非常直观。

扩展丰富:Flask的生态虽然不如Django完整,但也非常强大------Flask-SQLAlchemy、Flask-Migrate、Flask-Login、Flask-CORS等等。

Flask的缺点

选择困难:因为太灵活了,你需要自己选型。ORM用什么?表单验证用什么?权限管理用什么?对于新手来说,决策成本不低。

大型项目缺乏规范:Django有明确的目录结构和规范,Flask没有。5个Flask项目可能5种组织方式,团队协作时需要提前约定规范。

性能一般:Flask默认也是同步的,并发能力一般。但可以通过Gunicorn + 多Worker来提升。

适合的场景
  • RESTful API服务

  • 微服务

  • 原型验证

  • 简单网站

  • 对灵活性要求高的项目

三、FastAPI:异步时代的新宠

这两年FastAPI火得不行。我用它重构过一个老的Flask项目,性能提升了接近一倍,代码量反而减少了。

FastAPI的优点

高性能:FastAPI基于Starlette(ASGI)和Pydantic,性能直逼Node.js和Go。对于IO密集型场景(大量API调用、数据库查询),提升特别明显。

python

复制代码
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import asyncpg

app = FastAPI()

class UserCreate(BaseModel):
    name: str
    email: str
    age: int

@app.post("/users")
async def create_user(user: UserCreate):
    # 异步数据库操作
    conn = await asyncpg.connect(user='postgres', password='...')
    result = await conn.fetchrow(
        "INSERT INTO users(name, email, age) VALUES($1, $2, $3) RETURNING id",
        user.name, user.email, user.age
    )
    await conn.close()
    return {"id": result['id'], **user.dict()}

自动生成API文档 :这是FastAPI最吸引人的特性之一。写好代码,/docs/redoc就自动生成了交互式API文档。

python

复制代码
@app.get("/items/{item_id}")
async def get_item(item_id: int, q: str | None = None):
    """
    获取商品信息
    
    - **item_id**: 商品ID
    - **q**: 可选的查询参数
    """
    return {"item_id": item_id, "q": q}
# 访问 /docs 就能看到完整的文档

数据校验:基于Pydantic,类型注解就是校验规则,少写大量验证代码。

异步支持:原生async/await,在处理IO操作时非常高效。

FastAPI的缺点

生态还不成熟:相比Django和Flask,FastAPI的第三方扩展还不够丰富。异步ORM(如SQLAlchemy异步版、Tortoise-ORM)还在完善中。

相对年轻:遇到冷门问题,Stack Overflow上可能找不到答案,需要自己啃源码或提issue。

同步代码兼容问题 :如果用了同步的库(如requests),会阻塞事件循环,需要小心处理。

适合的场景
  • 高并发API服务

  • 实时Web应用(WebSocket)

  • 机器学习模型服务(FastAPI + PyTorch/TensorFlow)

  • 需要API文档规范的项目

  • 从零开始的新项目

四、我的选型决策框架

经过多年的实践,我总结了一个简单的决策框架:

python

复制代码
def choose_framework(project):
    if project.is_enterprise_cms():
        return "Django"
    elif project.is_microservice():
        if project.requires_high_concurrency():
            return "FastAPI"
        else:
            return "Flask"
    elif project.is_building_api():
        if project.team_knows_async():
            return "FastAPI"
        else:
            return "Flask + REST framework"
    elif project.is_simple_site():
        return "Flask"
    else:
        return "FastAPI"  # 新项目默认选FastAPI

更具体地说:

情况 推荐
内容型网站、后台管理 Django
REST API、微服务、高并发 FastAPI
小型项目、原型、灵活需求 Flask
需要WebSocket FastAPI
需要实时流数据 FastAPI
团队对Python很熟但对Web不熟 Django
团队追求代码性能和现代化 FastAPI

五、实战对比:同样的接口三种写法

来一个实际的对比,三个框架写同样的用户CRUD接口。

Flask 版本

python

复制代码
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    email = db.Column(db.String(100), unique=True)

@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = User.query.get(user_id)
    if not user:
        return jsonify({'error': 'User not found'}), 404
    return jsonify({'id': user.id, 'name': user.name, 'email': user.email})

@app.route('/users', methods=['POST'])
def create_user():
    data = request.get_json()
    user = User(name=data['name'], email=data['email'])
    db.session.add(user)
    db.session.commit()
    return jsonify({'id': user.id}), 201
FastAPI 版本

python

复制代码
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, EmailStr
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from sqlalchemy import select

app = FastAPI()

class UserCreate(BaseModel):
    name: str
    email: EmailStr

class UserResponse(BaseModel):
    id: int
    name: str
    email: str

@app.get('/users/{user_id}', response_model=UserResponse)
async def get_user(user_id: int):
    async with AsyncSession(engine) as session:
        result = await session.execute(
            select(User).where(User.id == user_id)
        )
        user = result.scalar_one_or_none()
        if not user:
            raise HTTPException(404, 'User not found')
        return user

@app.post('/users', response_model=UserResponse, status_code=201)
async def create_user(user: UserCreate):
    async with AsyncSession(engine) as session:
        db_user = User(**user.dict())
        session.add(db_user)
        await session.commit()
        await session.refresh(db_user)
        return db_user

FastAPI的版本多了类型注解、自动校验、自动文档,代码更安全更规范。

六、选择框架之外的建议

不要迷信框架:框架只是工具,业务才是核心。

考虑团队能力:如果团队都是Flask老手,突然切到FastAPI会有学习成本。

考虑项目规模:小项目选轻量框架,大项目选全功能框架。

不要过早优化:很多项目根本到不了"需要异步提升性能"的阶段。

技术选型不是一锤子买卖:可以先用Flask快速验证,后期再迁移到FastAPI。我们就是这么干的。

写在最后

三个框架没有绝对的好坏,只有合不合适。

  • Django:像一个精装修的房子,拎包入住,但改造麻烦

  • Flask:像一个毛坯房,你想怎么装修就怎么装修

  • FastAPI:像一个智能精装房,现代、高效、自带各种智能功能

如果你现在让我选一个新项目:

  • 内部管理系统 → Django

  • 对外API服务 → FastAPI

  • 简单的Demo或工具 → Flask

希望这篇文章能帮你做出合适的技术选型。

相关推荐
其实防守也摸鱼1 小时前
前端应用的离线暂停更新策略:构建稳定可靠的渐进式部署方案
服务器·前端·数据库·学习·ai·命令行·linux系统
太平洋月光1 小时前
Antv G2中自定义技巧📊
前端·数据可视化
shmily麻瓜小菜鸡2 小时前
前端“伪防盗链”方案
前端·javascript·vue.js·bootstrap·echarts
mayaairi2 小时前
JS数组完全指南(含十大操作详解)
开发语言·前端·javascript
蓝创工坊Blue Foundry2 小时前
扫描件批量转 Excel:先确认要整表还原还是字段汇总
python·pdf·ocr·excel
IT_陈寒2 小时前
Python的线程池把我CPU跑满了,原来少传了个参数
前端·人工智能·后端
二十雨辰2 小时前
[爬虫]-解析
开发语言·python
喜欢的名字被抢了2 小时前
写-Chrome-扩展时踩过的那些-MV3-的坑
前端·chrome
网安老伯2 小时前
网络安全基础要点知识介绍(非常详细),零基础入门到精通,看这一篇就够了
运维·前端·网络协议·web安全·网络安全·职场和发展