前置要求
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') %}
<h2>欢迎, {{ session['user'] }}!</h2>
<a href="/logout">退出登录</a>
{% else %}
<form method="POST">
<input name="username" placeholder="用户名" required>
<input name="password" type="password" placeholder="密码" required>
<button type="submit">登录</button>
{% 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 状态码