Flask 文件上传服务器 - 知识点总结
目录
- Flask 框架基础
- HTTP 协议
- 文件与路径处理
- Python 基础知识
- Linux 权限管理
- 服务器部署
1. Flask 框架基础
1.1 Flask 核心组件
| 组件 | 说明 |
|---|
Flask | 核心应用类,用于创建 Web 应用实例 |
request | 请求对象,用于获取客户端请求数据 |
jsonify() | 将 Python 对象转换为 JSON 响应 |
from flask import Flask, request, jsonify
app = Flask(__name__)
1.2 应用实例化
app = Flask(__name__)
__name__:Python 特殊变量,表示当前模块名称- 直接运行脚本时:
__name__ == '__main__' - 作为模块导入时:
__name__ 为模块名 - Flask 用它来确定应用的根目录
1.3 路由装饰器
@app.route('/path', methods=['GET', 'POST'])
def handler():
pass
- 将 URL 路径与 Python 函数绑定
- 支持多个装饰器指向同一函数(多路由)
methods 参数指定允许的 HTTP 方法
1.4 Flask 配置管理
app.config['KEY'] = value
app.config['MAX_CONTENT_LENGTH'] = 500 * 1024 * 1024
app.config 是 Flask 的配置字典- 可存储自定义配置项
- 支持通过配置文件或环境变量覆盖
2. HTTP 协议
2.1 常用 HTTP 方法
| 方法 | 说明 | 典型用途 |
|---|
GET | 获取资源 | 查询、列表 |
POST | 提交数据 | 文件上传、表单提交 |
DELETE | 删除资源 | 删除文件 |
2.2 Flask Request 对象
request.files
request.form
request.args
request.json
2.3 文件上传格式
- 前端使用
multipart/form-data 格式 - Flask 通过
request.files 获取 - 返回
FileStorage 对象
2.4 HTTP 状态码
| 状态码 | 含义 | 使用场景 |
|---|
200 | OK | 成功响应 |
400 | Bad Request | 请求格式错误 |
404 | Not Found | 资源不存在 |
413 | Request Entity Too Large | 文件过大 |
500 | Internal Server Error | 服务器内部错误 |
3. 文件与路径处理
3.1 os.path 模块
os.path.abspath(__file__)
os.path.dirname(path)
os.path.join(a, b)
os.path.basename(path)
os.path.splitext(path)
3.2 文件操作
os.listdir(path)
os.path.isfile(path)
os.path.exists(path)
os.path.getsize(path)
os.path.getmtime(path)
os.remove(path)
os.makedirs(path)
3.3 FileStorage 对象
Flask/Werkzeug 提供的上传文件封装类,继承自 Python 的 io.IOBase:
from werkzeug.datastructures import FileStorage
file = request.files['file']
3.3.1 核心属性
| 属性 | 说明 | 示例 |
|---|
filename | 上传文件的原始文件名 | "app-debug.apk" |
name | 表单字段名称 (name 属性) | "file" |
content_type | MIME 类型 | "application/vnd.android.package-archive" |
content_length | 文件大小(字节) | 11507896 |
3.3.2 核心方法
| 方法 | 说明 | 返回值 |
|---|
save(destination) | 保存文件到磁盘 | None |
read(size) | 读取文件内容 | bytes |
stream | 文件数据流对象 | FileStorage stream |
seek(offset) | 移动文件指针 | None |
tell() | 获取当前指针位置 | int |
close() | 关闭文件流 | None |
3.3.3 使用示例
file = request.files['file']
file.save(os.path.join(UPLOAD_FOLDER, file.filename))
content = file.read()
file.seek(0)
chunk = file.read(1024)
with open(os.path.join(UPLOAD_FOLDER, file.filename), 'wb') as f:
while True:
chunk = file.stream.read(8192)
if not chunk:
break
f.write(chunk)
3.3.4 安全注意事项
ALLOWED_EXTENSIONS = {'apk', 'ipa', 'exe'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1]. in ALLOWED_EXTENSIONS
filename = request.files['file'].filename
os.path.join(UPLOAD_FOLDER, filename)
from werkzeug.utils import secure_filename
filename = secure_filename(file.filename)
app.config['MAX_CONTENT_LENGTH'] = 500 * 1024 * 1024
3.3.5 常见问题处理
from werkzeug.utils import secure_filename
filename = secure_filename(file.filename)
import os
file_path = os.path.join(UPLOAD_FOLDER, file.filename)
if os.path.exists(file_path):
pass
3.4 时间戳转换
import time
timestamp = os.path.getmtime(path)
formatted = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))
4. Python 基础知识
4.1 字符串格式化
name = "Alice"
f"Hello, {name}"
f"{size} bytes"
f"{size / 1024 / 1024:.2f} MB"
4.2 异常处理
try:
pass
except Exception as e:
print(f"Error: {e}")
finally:
pass
4.3 主程序入口
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
__name__ == '__main__' 确保只在直接运行时执行- 作为模块导入时不执行
4.4 运算符
'in' in dict_or_list
not in
4.5 列表操作
files = [{'name': f, 'size': os.path.getsize(f)} for f in filenames if os.path.isfile(f)]
files.append({'name': filename})
5. Linux 权限管理
5.1 权限表示法
八进制表示:
| 值 | 权限 | 二进制 |
|---|
| 0 | --- | 000 |
| 1 | --x | 001 |
| 2 | -w- | 010 |
| 3 | -wx | 011 |
| 4 | r-- | 100 |
| 5 | r-x | 101 |
| 6 | rw- | 110 |
| 7 | rwx | 111 |
5.2 常见权限组合
| 权限 | 八进制 | 说明 |
|---|
rwxr-xr-x | 755 | 所有者全部权限,其他人读和执行 |
rw-r--r-- | 644 | 所有者读写,其他人读 |
rwxrwxrwx | 777 | 所有人全部权限(谨慎使用) |
5.3 Python os.chmod()
import os
os.chmod(path, 0o755)
os.chmod(path, 0o644)
5.4 权限作用对象
drwxr-xr-x
│││││││││
││││││││└─ 其他用户: 执行权限
│││││││└── 其他用户: 写权限
││││││└─── 其他用户: 读权限
│││││└──── 组用户: 执行权限
││││└───── 组用户: 写权限
│││└────── 组用户: 读权限
││└─────── 所有者: 执行权限
│└──────── 所有者: 写权限
└──────── 所有者: 读权限
d = 目录 (- = 文件)
6. 服务器部署
6.1 Flask 开发服务器
app.run(
host='0.0.0.0',
port=5000,
debug=False
)
host='0.0.0.0':允许局域网访问host='127.0.0.1':仅本地访问debug=True:代码修改自动重启,显示详细错误
6.2 生产环境服务器
Flask 内置服务器不适合生产环境,推荐使用:
| 服务器 | 说明 |
|---|
| Gunicorn | 轻量级,推荐 Python WSGI 项目 |
| uWSGI | 功能强大,适合大型项目 |
| Nginx | 反向代理服务器 |
Gunicorn 示例:
gunicorn -w 4 -b 0.0.0.0:92 app:app
6.3 守护进程运行
nohup python app.py &
[Unit]
Description=Upload Server
After=network.target
[Service]
ExecStart=/usr/bin/python3 /path/to/app.py
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl start upload
sudo systemctl enable upload
附录:代码结构速查
upload_server.py
├── 导入模块
│ ├── flask.Flask
│ ├── flask.request
│ ├── flask.jsonify
│ └── os
│
├── 配置
│ ├── UPLOAD_FOLDER # 上传目录
│ ├── DIR_PERMISSIONS # 目录权限 0o755
│ ├── FILE_PERMISSIONS # 文件权限 0o644
│ └── MAX_CONTENT_LENGTH # 最大上传大小
│
├── 路由
│ ├── POST /upload # 上传文件
│ ├── GET /files # 文件列表
│ └── DELETE /delete/<file> # 删除文件
│
└── 启动
└── if __name__ == '__main__':
学习资源
所有评论(0)