使用 Python Flask 实现 RESTful API 文件传输
在现代 web 开发中,文件上传和下载是非常常见的功能。本文将通过一个 Python Flask 的 RESTful API 示例,演示如何实现文件传输功能。假设我们要开发一个简单的应用程序,用户可以上传旅行相关的文件,例如图片,并且可以随时下载这些文件。
实际问题
我们设想一个需要存储旅行相关材料的场景。用户可能会上传护照复印件、机票确认信等文件。我们的目标是创建一个 API,允许用户进行文件上传和下载。
系统架构
我们的 API 结构将包括以下几个部分:
- 上传文件的端点
- 下载文件的端点
- 文件存储的管理
- 数据库设计(存储文件元数据)
数据库设计
我们将创建一个简单的数据库模型来存储文件的信息。使用 Mermaid 语法生成的ER图如下:
erDiagram
FILE {
int id PK
string filename
string file_path
string uploaded_at
}
USER {
int id PK
string username
string password
}
USER ||--o| FILE : uploads
上述模型中,用户可以上传多个文件,文件的信息将被存储在数据库中。
Flask API 实现
接下来我们将开始实现 Flask RESTful API。首先,确保安装 Flask 和 Flask-SQLAlchemy:
pip install Flask Flask-SQLAlchemy
然后,创建 app.py
文件,定义基本的 API:
from flask import Flask, request, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
import os
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///files.db'
app.config['UPLOAD_FOLDER'] = 'uploads/'
db = SQLAlchemy(app)
class File(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(100), nullable=False)
file_path = db.Column(db.String(200), nullable=False)
db.create_all()
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'message': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'message': 'No file selected'}), 400
file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(file_path)
new_file = File(filename=file.filename, file_path=file_path)
db.session.add(new_file)
db.session.commit()
return jsonify({'message': 'File uploaded successfully', 'file_id': new_file.id}), 201
@app.route('/files/<int:file_id>', methods=['GET'])
def download_file(file_id):
file = File.query.get_or_404(file_id)
return send_from_directory(app.config['UPLOAD_FOLDER'], file.filename)
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,用户可以通过 /upload
端点上传文件,文件的元数据会被存储在 SQLite 数据库中。通过上传的文件 ID,用户可以通过 /files/<file_id>
端点下载相应的文件。
使用示例
-
上传文件
我们可以使用
curl
命令上传文件:curl -F "file=@/path/to/your/file.jpg" http://localhost:5000/upload
-
下载文件
下载文件使用文件 ID:
curl -O http://localhost:5000/files/1
旅行图
以下是展示用户上传和下载文件的旅行图,使用 Mermaid 语法:
journey
title 用户文件传输旅程
section 上传文件
用户选择文件: 5: 上传中文章上传文件
上传文件到API: 5: 成功
section 下载文件
用户请求文件: 5: 下载成功
结论
通过这篇文章,我们展示了如何在 Python Flask 中创建 RESTful API,实现文件的上传和下载功能。我们使用了 Flask-SQLAlchemy 来管理数据库,确保了文件元数据的存储。同时,结合 Mermaid 语法,我们对数据库设计和用户旅程进行了可视化,帮助更好地理解系统的整体架构。希望这个示例能对你的开发工作有所帮助!