🔎大家好,我是ZTLJQ,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
📝个人主页-ZTLJQ的主页
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝📣系列果你对这个系列感兴趣的话
专栏 - Python从零到企业级应用:短时间成为市场抢手的程序员
✔说明⇢本人讲解主要包括Python爬虫、JS逆向、Python的企业级应用
如果你对这个系列感兴趣的话,可以关注订阅哟👋
从零到一的全栈之路
在当今的软件开发领域,"全栈"一词早已深入人心。它代表着一种能力,即开发者能够独立完成一个Web应用从前端用户界面到后端数据处理的全部开发工作。对于Python开发者而言,选择一个合适的全栈框架 或后端框架是项目成功的基石。
一个优秀的Python全栈框架不仅能帮你快速搭建应用的骨架,还能处理诸如URL路由、数据库交互、用户认证、模板渲染、静态文件服务、API接口等核心任务。本篇博客将为您深入剖析Python生态中三大主流框架------Django 、FastAPI 和Flask,并通过实际案例,带您领略它们各自的魅力与适用场景。
第一部分:Django - "企业级"的全能巨人
Django被誉为"为完美主义者和懒惰者设计的Web框架"。它遵循"约定优于配置"(Convention over Configuration)的理念,提供了一套强大且全面的"电池已包含"(Batteries-Included)解决方案,是构建功能复杂、内容驱动的大型Web应用的首选。
1.1 核心哲学与特点
- 全功能,开箱即用: Django内置了ORM(对象关系映射)、Admin后台管理、用户认证、权限系统、国际化、缓存、会话管理等几乎所有Web应用需要的功能。这意味着你可以快速启动项目,而无需寻找和集成大量第三方库。
- MTV模式 : Django采用了模型(Model)、模板(Template)、视图(View)的架构模式。
- Model (模型): 负责数据的定义和数据库交互。你只需要定义Python类,Django ORM会自动将其映射为数据库表。
- Template (模板): 负责数据的呈现。它是一个带有特殊标记的HTML文件,可以动态地嵌入后端传来的数据。
- View (视图): 是逻辑的中心,接收用户请求,与Model和Template交互,最终返回响应。
- 强大的Admin后台 : Django最令人惊艳的功能之一。只需在
admin.py中注册你的模型,Django就会自动生成一个功能强大的管理界面,让你可以轻松地增删改查数据库中的数据。
1.2 实战案例:快速搭建一个博客系统
让我们通过创建一个简单的博客(Blog)来体验Django的强大。
第一步:环境准备
bash
# 创建虚拟环境 (推荐)
python -m venv myblog_env
source myblog_env/bin/activate # Linux/Mac
# myblog_env\Scripts\activate # Windows
# 安装Django
pip install django
第二步:创建项目和应用
bash
django-admin startproject mysite
cd mysite
python manage.py startapp blog
现在,项目结构如下:
bash
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
blog/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
第三步:定义数据模型 (blog/models.py)
python
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
第四步:注册模型到Admin (blog/admin.py)
python
from django.contrib import admin
from .models import Post, Category
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'category', 'created_at')
list_filter = ('author', 'category', 'created_at')
search_fields = ('title', 'content')
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name',)
第五步:创建和应用数据库迁移
bash
1python manage.py makemigrations
2python manage.py migrate
第六步:创建超级用户
bash
python manage.py createsuperuser
按提示输入用户名、邮箱和密码。
第七步:运行开发服务器
bash
python manage.py runserver
现在,访问 http://127.0.0.1:8000/admin/,使用刚才创建的超级用户登录。瞧!一个功能完备的后台管理系统已经自动生成,你可以直接在这里创建分类和博客文章。
案例解析 : Django的ORM和Admin是其核心优势。通过简单的
models.py定义,我们就完成了数据结构的设计,并获得了配套的管理界面,极大地提升了开发效率。
第二部分:FastAPI - "现代化"的异步性能之王
FastAPI是一个现代、快速(高性能)的Web框架,专为构建API而生。它基于Python 3.7+的类型提示(Type Hints)构建,能够自动生成交互式API文档(Swagger UI, ReDoc),并原生支持异步编程,性能表现优异。
2.1 核心特性
- 高性能: 在性能基准测试中,FastAPI常常名列前茅,甚至超过Node.js和Go的某些框架。
- 异步支持 : 原生支持
async/await,可以轻松处理I/O密集型任务(如数据库查询、外部API调用),在高并发场景下表现卓越。 - 自动文档: 通过类型提示,FastAPI能自动生成美观、交互式的API文档,大大减少了API测试和沟通成本。
- 依赖注入: 提供了一个强大的依赖注入系统,使代码更易于测试和维护。
2.2 实战案例:构建一个高性能的待办事项API
让我们用FastAPI创建一个RESTful API。
第一步:安装FastAPI和ASGI服务器
bash
pip install fastapi uvicorn[standard]
第二步:编写API (main.py)
python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
import uvicorn
app = FastAPI(title="Todo API", description="A simple todo API built with FastAPI")
# Pydantic模型用于请求体和响应体的验证
class TodoItem(BaseModel):
id: int
task: str
completed: bool = False
# 模拟数据库 (在实际项目中应使用真实的数据库)
todo_db: List[TodoItem] = [
TodoItem(id=1, task="Buy groceries", completed=False),
TodoItem(id=2, task="Write blog post", completed=True),
]
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/todos/", response_model=List[TodoItem])
def get_todos():
return todo_db
@app.get("/todos/{todo_id}", response_model=TodoItem)
def get_todo(todo_id: int):
for item in todo_db:
if item.id == todo_id:
return item
raise HTTPException(status_code=404, detail="Todo not found")
@app.post("/todos/", response_model=TodoItem)
def create_todo(todo: TodoItem):
# 简单检查ID是否冲突
if any(item.id == todo.id for item in todo_db):
raise HTTPException(status_code=400, detail="ID already exists")
todo_db.append(todo)
return todo
@app.put("/todos/{todo_id}", response_model=TodoItem)
def update_todo(todo_id: int, updated_todo: TodoItem):
for i, item in enumerate(todo_db):
if item.id == todo_id:
todo_db[i] = updated_todo
return updated_todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.delete("/todos/{todo_id}")
def delete_todo(todo_id: int):
global todo_db
original_len = len(todo_db)
todo_db = [item for item in todo_db if item.id != todo_id]
if len(todo_db) == original_len:
raise HTTPException(status_code=404, detail="Todo not found")
return {"message": "Todo deleted successfully"}
if __name__ == "__main__":
# uvicorn是FastAPI推荐的ASGI服务器
uvicorn.run(app, host="0.0.0.0", port=8000)
第三步:运行API服务器
bash
python main.py
第四步:访问自动生成的文档
启动后,访问 http://127.0.0.1:8000/docs,你将看到一个由FastAPI自动生成的、功能强大的Swagger UI界面。你可以在上面直接测试每一个API端点,无需任何额外的工具。
案例解析 : FastAPI的代码非常清晰。
@app.get,@app.post等装饰器定义了路由;Pydantic模型TodoItem不仅用于数据验证,还自动生成了文档的Schema。uvicorn作为ASGI服务器,为异步性能提供了保障。
第三部分:Flask - "轻量级"的自由灵活派
Flask被称为"微框架",它提供了一个坚实的核心,但将大部分功能的选择权留给了开发者。这种极简主义的设计哲学使其非常灵活,适合从简单的脚本到中等复杂度的Web应用。
3.1 核心特点
- 轻量级与灵活: Flask的核心非常小,你可以根据项目需要,自由选择数据库、模板引擎、表单验证库等组件(如SQLAlchemy, Jinja2, WTForms)。
- 易于学习: 对于Python新手来说,Flask的入门门槛非常低,几行代码就能启动一个Web服务。
- 强大的扩展生态 : 社区提供了大量的扩展(Extensions),如
Flask-SQLAlchemy,Flask-Login,Flask-Mail等,可以轻松地为应用增加复杂功能。
3.2 实战案例:一个简单的用户注册与登录
python
from flask import Flask, render_template, request, redirect, url_for, flash, session
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.secret_key = 'your-super-secret-key' # 用于加密session
# 模拟用户数据库
users_db = {}
@app.route('/')
def index():
if 'user' in session:
return f'<h1>Hello, {session["user"]}!</h1><a href="/logout">Logout</a>'
return '<a href="/register">Register</a> or <a href="/login">Login</a>'
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users_db:
flash('Username already exists!')
else:
# 存储哈希后的密码
users_db[username] = generate_password_hash(password)
flash('Registration successful!')
return redirect(url_for('login'))
return '''
<form method="post">
Username: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br>
<input type="submit" value="Register">
</form>
'''
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users_db and check_password_hash(users_db[username], password):
session['user'] = username
flash('Login successful!')
return redirect(url_for('index'))
else:
flash('Invalid username or password.')
return '''
<form method="post">
Username: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br>
<input type="submit" value="Login">
</form>
'''
@app.route('/logout')
def logout():
session.pop('user', None)
flash('You have been logged out.')
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
案例解析 : Flask的代码非常直观。
@app.route定义路由,request对象处理用户输入,session用于管理用户状态。它没有内置的ORM或Admin,一切都需要开发者自己决定和实现,这既是优点也是缺点。
第四部分:框架选择指南
| 特性 | Django | FastAPI | Flask |
|---|---|---|---|
| 学习曲线 | 中等 | 中等 | 简单 |
| 开发速度 | 快(内置功能多) | 快(自动文档) | 中等(需自行选择组件) |
| 性能 | 高 | 极高(异步支持) | 中等 |
| 适用场景 | 全功能网站、CMS、管理后台 | 高性能API、微服务、数据科学接口 | 小型项目、原型、需要高度定制的项目 |
| 核心哲学 | 电池已包含 | 现代、快速、自动化 | 微框架、灵活 |
结论:
- 选择Django:当你需要快速构建一个功能全面、内容驱动的大型网站时。
- 选择FastAPI:当你专注于构建高性能的API,特别是需要异步处理能力时。
- 选择Flask:当你需要一个轻量级、灵活的框架,或者想对应用的每个细节都有完全的掌控权时。
