python 生态系统中有三个主流的 web 开发框架:django、flask 和 fastapi。
它们在设计哲学、功能特性和适用场景上各有不同。
1. 框架概览对比
特性 | django | flask | fastapi |
---|---|---|---|
类型 | 全功能框架 | 微框架 | 现代异步框架 |
学习曲线 | 较陡峭 | 平缓 | 中等 |
内置功能 | orm, admin, auth, 模板 | 仅基础路由和模板 | 自动文档, 数据验证 |
性能 | 中等 | 中等 | 高性能(基于starlette) |
异步支持 | 3.0+ 支持 | 不支持 | 原生支持 |
适用场景 | 内容管理系统, 企业应用 | 小型应用, 微服务 | api 服务, 实时应用 |
数据验证 | 表单系统 | 需扩展 | 内置(pydantic) |
自动文档 | 需第三方 | 需第三方 | 内置(openapi/swagger) |
2. 各框架示例
2.1 django 示例
安装:
pip install django
基础项目结构:
myproject/ manage.py myproject/ __init__.py settings.py urls.py wsgi.py myapp/ models.py views.py urls.py
示例代码:
# myapp/views.py from django.http import jsonresponse from django.views.decorators.csrf import csrf_exempt from .models import book @csrf_exempt def book_list(request): if request.method == 'get': books = book.objects.all() data = [{'title': book.title, 'author': book.author} for book in books] return jsonresponse(data, safe=false) elif request.method == 'post': title = request.post.get('title') author = request.post.get('author') book = book.objects.create(title=title, author=author) return jsonresponse({'id': book.id}, status=201) # myapp/urls.py from django.urls import path from . import views urlpatterns = [ path('books/', views.book_list), ] # myproject/urls.py from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('myapp.urls')), ]
2.2 flask 示例
安装:
pip install flask
基础应用:
from flask import flask, request, jsonify app = flask(__name__) books = [ {"id": 1, "title": "python编程", "author": "john doe"}, {"id": 2, "title": "flask web开发", "author": "jane smith"} ] @app.route('/books', methods=['get', 'post']) def handle_books(): if request.method == 'get': return jsonify(books) if request.method == 'post': new_book = request.json new_book['id'] = len(books) + 1 books.append(new_book) return jsonify(new_book), 201 @app.route('/books/<int:book_id>', methods=['get', 'put', 'delete']) def handle_book(book_id): book = next((b for b in books if b['id'] == book_id), none) if not book: return jsonify({"error": "book not found"}), 404 if request.method == 'get': return jsonify(book) if request.method == 'put': data = request.json book.update(data) return jsonify(book) if request.method == 'delete': books.remove(book) return '', 204 if __name__ == '__main__': app.run(debug=true)
2.3 fastapi 示例
安装:
pip install fastapi uvicorn
基础应用:
from fastapi import fastapi, httpexception from pydantic import basemodel from typing import list app = fastapi() class book(basemodel): title: str author: str books_db = [ {"id": 1, "title": "python编程", "author": "john doe"}, {"id": 2, "title": "fastapi开发", "author": "jane smith"} ] @app.get("/books", response_model=list[book]) async def read_books(): return books_db @app.post("/books", response_model=book, status_code=201) async def create_book(book: book): new_book = book.dict() new_book["id"] = len(books_db) + 1 books_db.append(new_book) return new_book @app.get("/books/{book_id}", response_model=book) async def read_book(book_id: int): book = next((b for b in books_db if b["id"] == book_id), none) if not book: raise httpexception(status_code=404, detail="book not found") return book # 自动文档访问: # - swagger ui: http://127.0.0.1:8000/docs # - redoc: http://127.0.0.1:8000/redoc
3. 性能对比
以下是简单基准测试结果 (每秒请求数):
框架 | 同步请求 | 异步请求 |
---|---|---|
django | ~1,200 | ~3,500 |
flask | ~1,500 | n/a |
fastapi | ~2,800 | ~15,000 |
4. 选择建议
选择 django 如果:
- 你需要一个"全包含"的框架
- 项目需要内置的管理后台
- 需要orm和数据库迁移工具
- 构建内容管理系统或企业级应用
选择 flask 如果:
- 你需要极简的微框架
- 项目规模小或需要高度灵活性
- 你想自己选择组件和扩展
- 构建小型api或微服务
选择 fastapi 如果:
- 你需要高性能的api服务
- 项目需要自动api文档
- 使用现代python特性(async/await)
- 构建数据密集型或实时应用
5. 扩展生态
django:
- drf (django rest framework)
- django channels (websocket)
- django orm扩展
flask:
- flask-restful (api开发)
- flask-sqlalchemy (orm)
- flask-socketio (websocket)
fastapi:
- fastapi users (认证)
- tortoise-orm (异步orm)
- websocket原生支持
每个框架都有其独特的优势和适用场景,选择应根据项目需求、团队熟悉度和长期维护考虑来决定。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论