前置要求

pip install flask fastapi uvicorn

1. Flask 个人博客 API

目标:构建 RESTful API,实现文章的增删改查

from flask import Flask, jsonify, request

app = Flask(__name__)

posts = [
    {"id": 1, "title": "Hello Flask", "content": "这是我的第一篇博客"}
]

@app.route('/api/posts', methods=['GET'])
def get_posts():
    return jsonify(posts)

@app.route('/api/posts', methods=['POST'])
def create_post():
    data = request.get_json()
    new_post = {
        "id": len(posts) + 1,
        "title": data['title'],
        "content": data['content']
    }
    posts.append(new_post)
    return jsonify(new_post), 201

@app.route('/api/posts/<int:post_id>', methods=['DELETE'])
def delete_post(post_id):
    global posts
    posts = [p for p in posts if p['id'] != post_id]
    return jsonify({"message": "已删除"})

if __name__ == '__main__':
    app.run(debug=True)

知识点:Flask 路由、HTTP 方法、jsonify、请求处理


2. FastAPI 图书管理接口

目标:使用 FastAPI 构建带自动文档的 API

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(title="图书管理系统")

class Book(BaseModel):
    id: int
    title: str
    author: str
    price: float

books = []

@app.get("/books")
def list_books():
    return books

@app.post("/books")
def add_book(book: Book):
    books.append(book.dict())
    return {"message": "图书已添加", "book": book}

@app.get("/books/{book_id}")
def get_book(book_id: int):
    for book in books:
        if book['id'] == book_id:
            return book
    return {"error": "图书不存在"}

# 启动: uvicorn main:app --reload
# 文档地址: http://localhost:8000/docs

知识点:FastAPI、Pydantic 模型、自动 API 文档


3. 简易 Web 爬虫 + 展示

目标:抓取网页数据并在 Web 页面展示

from flask import Flask, render_template_string
import requests
from bs4 import BeautifulSoup

app = Flask(__name__)

HTML_TEMPLATE = """
<!DOCTYPE html>
<html>
<head><title>热门新闻</title></head>
<body>
    <h1>今日热门</h1>
    <ul>
    {% for item in news %}
        <li><a href="{{ item.link }}">{{ item.title }}</a></li>
    {% endfor %}
    </ul>
</body>
</html>
"""

@app.route('/')
def index():
    news = [
        {"title": "Python 3.14 发布", "link": "#"},
        {"title": "AI 编程助手新进展", "link": "#"},
    ]
    return render_template_string(HTML_TEMPLATE, news=news)

if __name__ == '__main__':
    app.run(debug=True)

知识点requests 请求、BeautifulSoup 解析、模板渲染


4. Flask 用户登录系统

目标:实现 session 认证和登录功能

from flask import Flask, request, redirect, url_for, session, render_template_string

app = Flask(__name__)
app.secret_key = 'your-secret-key'

users_db = {'admin': 'password123', 'user1': 'abc456'}

LOGIN_HTML = """
{% if session.get('user') %}
&lt;h2&gt;欢迎, {{ session['user'] }}!&lt;/h2&gt;
&lt;a href="/logout"&gt;退出登录&lt;/a&gt;
{% else %}
&lt;form method="POST"&gt;
    &lt;input name="username" placeholder="用户名" required&gt;
    &lt;input name="password" type="password" placeholder="密码" required&gt;
    &lt;button type="submit"&gt;登录&lt;/button&gt;
{% endif %}
"""

@app.route('/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if users_db.get(username) == password:
            session['user'] = username
    return render_template_string(LOGIN_HTML)

@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)

知识点session 管理、表单处理、重定向、模板条件渲染


5. FastAPI 文件上传接口

目标:构建文件上传和处理 API

from fastapi import FastAPI, UploadFile, File
import shutil

app = FastAPI(title="文件上传服务")

@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):
    with open(f"uploads/{file.filename}", "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)
    return {
        "filename": file.filename,
        "content_type": file.content_type,
        "message": "上传成功"
    }

@app.post("/upload/multiple")
async def upload_multiple(files: list[UploadFile] = File(...)):
    results = []
    for file in files:
        with open(f"uploads/{file.filename}", "wb") as buffer:
            shutil.copyfileobj(file.file, buffer)
        results.append({"filename": file.filename, "status": "ok"})
    return {"uploaded": results}

# 启动: uvicorn main:app --reload

知识点:文件上传、UploadFile、异步处理、shutil


6. Flask RESTful Todo API(完整版)

目标:实现完整的 CRUD + 过滤和分页

from flask import Flask, jsonify, request
from datetime import datetime

app = Flask(__name__)

todos = [
    {"id": 1, "title": "学 Python", "done": False, "created": "2026-01-01"},
    {"id": 2, "title": "做练习", "done": True, "created": "2026-01-02"},
]
next_id = 3

@app.route('/api/todos', methods=['GET'])
def get_todos():
    done = request.args.get('done')
    page = int(request.args.get('page', 1))
    per_page = int(request.args.get('per_page', 10))
    
    result = todos
    if done is not None:
        result = [t for t in result if t['done'] == (done == 'true')]
    
    start = (page - 1) * per_page
    end = start + per_page
    return jsonify({
        "data": result[start:end],
        "total": len(result),
        "page": page
    })

@app.route('/api/todos', methods=['POST'])
def create_todo():
    global next_id
    data = request.get_json()
    todo = {
        "id": next_id,
        "title": data['title'],
        "done": False,
        "created": datetime.now().strftime('%Y-%m-%d')
    }
    todos.append(todo)
    next_id += 1
    return jsonify(todo), 201

@app.route('/api/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
    data = request.get_json()
    for todo in todos:
        if todo['id'] == todo_id:
            todo['done'] = data.get('done', todo['done'])
            todo['title'] = data.get('title', todo['title'])
            return jsonify(todo)
    return jsonify({"error": "未找到"}), 404

if __name__ == '__main__':
    app.run(debug=True)

知识点:CRUD、查询参数过滤、分页、HTTP 状态码