使用 Python 构建一个简单的 RESTful API 服务
在现代软件开发中,RESTful API(Representational State Transfer)已经成为前后端分离架构中最常见的通信方式之一。通过构建 RESTful API,我们可以让前端、移动端或其他服务轻松地与后端进行数据交互。
本文将介绍如何使用 Python 的 Flask 框架来构建一个简单的 RESTful API 服务,并实现基本的 CRUD(创建、读取、更新、删除)操作。我们将从零开始搭建项目结构,编写代码,并展示如何测试 API 接口。
环境准备
在开始之前,请确保你已经安装了以下工具和库:
Python 3.8 或以上版本pip 包管理器Flask 框架(可以通过pip install flask
安装)Postman 或 curl(用于测试 API)项目结构设计
为了便于管理和扩展,我们采用如下项目结构:
rest_api/│├── app.py # 主程序入口├── models.py # 数据模型定义├── database.py # 数据库连接配置└── requirements.txt # 依赖包列表
数据库配置
我们将使用 SQLite 作为本地开发数据库,它不需要复杂的安装过程,适合快速原型开发。
database.py
import sqlite3def connect_db(): return sqlite3.connect('users.db')def init_db(): with connect_db() as conn: cur = conn.cursor() cur.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE ) ''') conn.commit()if __name__ == '__main__': init_db()
运行该脚本将创建一个名为 users.db
的数据库文件以及 users
表。
数据模型定义
虽然我们只用到了一个简单的表,但我们仍然可以封装一些操作函数到模型中。
models.py
from database import connect_dbdef get_all_users(): with connect_db() as conn: cur = conn.cursor() cur.execute("SELECT * FROM users") rows = cur.fetchall() return [{"id": row[0], "name": row[1], "email": row[2]} for row in rows]def get_user_by_id(user_id): with connect_db() as conn: cur = conn.cursor() cur.execute("SELECT * FROM users WHERE id=?", (user_id,)) row = cur.fetchone() if row: return {"id": row[0], "name": row[1], "email": row[2]} return Nonedef create_user(name, email): with connect_db() as conn: cur = conn.cursor() try: cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", (name, email)) conn.commit() return {"message": "User created", "id": cur.lastrowid} except sqlite3.IntegrityError: return {"error": "Email already exists"}def update_user(user_id, name, email): with connect_db() as conn: cur = conn.cursor() cur.execute("UPDATE users SET name=?, email=? WHERE id=?", (name, email, user_id)) conn.commit() if cur.rowcount == 0: return {"error": "User not found"} return {"message": "User updated"}def delete_user(user_id): with connect_db() as conn: cur = conn.cursor() cur.execute("DELETE FROM users WHERE id=?", (user_id,)) conn.commit() if cur.rowcount == 0: return {"error": "User not found"} return {"message": "User deleted"}
Flask 主程序与路由设置
接下来,我们将使用 Flask 来创建 Web 应用并绑定 API 路由。
app.py
from flask import Flask, request, jsonifyfrom models import *app = Flask(__name__)@app.route('/users', methods=['GET'])def list_users(): users = get_all_users() return jsonify(users)@app.route('/users/<int:user_id>', methods=['GET'])def get_user(user_id): user = get_user_by_id(user_id) if user: return jsonify(user) return jsonify({"error": "User not found"}), 404@app.route('/users', methods=['POST'])def add_user(): data = request.get_json() name = data.get('name') email = data.get('email') if not name or not email: return jsonify({"error": "Missing name or email"}), 400 result = create_user(name, email) if 'error' in result: return jsonify(result), 400 return jsonify(result), 201@app.route('/users/<int:user_id>', methods=['PUT'])def edit_user(user_id): data = request.get_json() name = data.get('name') email = data.get('email') if not name or not email: return jsonify({"error": "Missing name or email"}), 400 result = update_user(user_id, name, email) if 'error' in result: return jsonify(result), 400 return jsonify(result)@app.route('/users/<int:user_id>', methods=['DELETE'])def remove_user(user_id): result = delete_user(user_id) if 'error' in result: return jsonify(result), 400 return jsonify(result)if __name__ == '__main__': app.run(debug=True)
API 测试
启动服务:
python app.py
服务默认运行在 http://127.0.0.1:5000/
。
你可以使用 Postman 或命令行工具如 curl
进行测试。
示例请求:
创建用户(POST)
curl -X POST http://localhost:5000/users -H "Content-Type: application/json" -d '{"name":"Alice","email":"alice@example.com"}'
获取所有用户(GET)
curl http://localhost:5000/users
获取单个用户(GET)
curl http://localhost:5000/users/1
更新用户(PUT)
curl -X PUT http://localhost:5000/users/1 -H "Content-Type: application/json" -d '{"name":"Alice Smith","email":"alice.smith@example.com"}'
删除用户(DELETE)
curl -X DELETE http://localhost:5000/users/1
总结
通过本文,我们学习了如何使用 Python 和 Flask 构建一个完整的 RESTful API 服务。我们实现了基本的 CRUD 操作,并使用 SQLite 作为后端数据库。整个项目结构清晰、易于扩展,适合作为小型项目或教学示例。
当然,在生产环境中,还需要考虑诸如身份验证、错误处理、日志记录、数据库迁移、性能优化等问题。但本文提供了一个良好的起点。
附录:依赖列表
requirements.txt
Flask==2.3.3
可以通过以下命令安装依赖:
pip install -r requirements.txt
如果你对这个项目感兴趣,还可以尝试集成 Swagger UI 来自动生成 API 文档,或者使用 SQLAlchemy 替代原生 SQL 实现更高级的对象关系映射(ORM)。这些都可以作为下一步的学习方向。