文章目录
- 安装: 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’)), ]
- 安装: 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)
- 安装: 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
目录
- 1. 框架概览对比
- 2. 各框架示例
- 2.1 Django 示例
- 2.2 Flask 示例
- 2.3 FastAPI 示例
- 3. 性能对比
- 4. 选择建议
- 5. 扩展生态
- 总结
Python 生态系统中有三个主流的 Web 开发框架:Django、Flask 和 FastAPI。
它们在设计哲学、功能特性和适用场景上各有不同。
| 特性 | Django | Flask | FastAPI |
|---|---|---|---|
| 类型 | 全功能框架 | 微框架 | 现代异步框架 |
| 学习曲线 | 较陡峭 | 平缓 | 中等 |
| 内置功能 | ORM, Admin, Auth, 模板 | 仅基础路由和模板 | 自动文档, 数据验证 |
| 性能 | 中等 | 中等 | 高性能(基于Starlette) |
| 异步支持 | 3.0+ 支持 | 不支持 | 原生支持 |
| 适用场景 | 内容管理系统, 企业应用 | 小型应用, 微服务 | API 服务, 实时应用 |
| 数据验证 | 表单系统 | 需扩展 | 内置(Pydantic) |
| 自动文档 | 需第三方 | 需第三方 | 内置(OpenAPI/Swagger) |
安装:
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')),
]
安装:
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)
安装:
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
以下是简单基准测试结果 (每秒请求数):
| 框架 | 同步请求 | 异步请求 |
|---|---|---|
| Django | ~1,200 | ~3,500 |
| Flask | ~1,500 | N/A |
| FastAPI | ~2,800 | ~15,000 |
选择 Django 如果:
- 你需要一个"全包含"的框架
- 项目需要内置的管理后台
- 需要ORM和数据库迁移工具
- 构建内容管理系统或企业级应用
选择 Flask 如果:
- 你需要极简的微框架
- 项目规模小或需要高度灵活性
- 你想自己选择组件和扩展
- 构建小型API或微服务
选择 FastAPI 如果:
- 你需要高性能的API服务
- 项目需要自动API文档
- 使用现代Python特性(async/await)
- 构建数据密集型或实时应用
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原生支持
每个框架都有其独特的优势和适用场景,选择应根据项目需求、团队熟悉度和长期维护考虑来决定。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。
您可能感兴趣的文章:
- Python解决“ImportError: Couldn‘t import Django”问题全攻略
- python使用django调用deepseek api搭建ai网站
- Python Django查询集的延迟加载特性详解
- python web 开发之Flask中间件与请求处理钩子的最佳实践
- Python Flask 库及应用场景