Python Web 框架对比与实战:Django vs Flask vs FastAPI
Python Web 框架对比与实战:Django vs Flask vs FastAPI
1. 背景与动机
Python 拥有丰富的 Web 开发框架,每个框架都有其特点和适用场景。本文对比 Django、Flask 和 FastAPI 三大主流框架,帮助开发者选择合适的工具。
2. 框架对比
| 特性 | Django | Flask | FastAPI |
|---|---|---|---|
| 学习曲线 | 陡峭 | 平缓 | 中等 |
| 功能完整性 | 全功能 | 微框架 | 现代API |
| 性能 | 中等 | 中等 | 高 |
| 异步支持 | 有限 | 扩展支持 | 原生支持 |
| 自动文档 | 无 | 扩展 | 内置 |
3. Django 实战
# models.py from django.db import models class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) # views.py from django.shortcuts import render from rest_framework import viewsets from .models import Article from .serializers import ArticleSerializer class ArticleViewSet(viewsets.ModelViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer 4. Flask 实战
from flask import Flask, jsonify, request from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) @app.route('/users', methods=['GET', 'POST']) def users(): if request.method == 'POST': user = User(username=request.json['username']) db.session.add(user) db.session.commit() return jsonify({'id': user.id}), 201 users = User.query.all() return jsonify([{'id': u.id, 'username': u.username} for u in users]) 5. FastAPI 实战
from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List app = FastAPI() class Item(BaseModel): name: str price: float items = [] @app.get("/items", response_model=List[Item]) def get_items(): return items @app.post("/items") def create_item(item: Item): items.append(item) return item @app.get("/items/{item_id}") def get_item(item_id: int): if item_id >= len(items): raise HTTPException(status_code=404, detail="Item not found") return items[item_id] 6. 性能测试
# 使用 locust 进行压力测试 from locust import HttpUser, task class WebsiteUser(HttpUser): @task def get_items(self): self.client.get("/items") 7. 结论
- Django:适合大型项目,需要快速开发完整功能
- Flask:适合小型项目,需要灵活性和简洁性
- FastAPI:适合现代 API 开发,需要高性能和自动文档