1、项目导览与环境搭建:了解图片资源管理系统的核心功能,搭建 Python + Flask + SQLite 开发环境

各位同学,欢迎来到《从零构建图片资源管理系统》的第一章。

说实话,我见过太多人一上来就撸代码,结果写到一半发现架构选错了,或者数据库根本撑不住业务场景。我自己早期带团队时也踩过这个坑——项目做到第三周,发现 Flask 版本不兼容,SQLite 的并发写入直接把服务搞挂了。嗯,从那以后我养成了一个习惯:先看全景,再动手。

这一章,我们不急着写代码。先搞清楚我们要做什么,再搭好环境。你想想看,盖房子总得先看图纸、备好工具吧?

1.1 图片资源管理系统到底长什么样?

说白了,这个系统就是一个「图片仓库」。用户上传图片,系统存起来,然后能查、能删、能管理。我参与过的几个企业内部系统,核心功能其实都差不多。

我们这门课要做的系统,包含以下核心模块:

模块 功能描述 我踩过的坑
图片上传 支持单张/批量上传,限制文件类型和大小 曾经没做文件类型校验,用户传了个 .exe 进来……
图片列表 分页展示所有图片,支持缩略图预览 缩略图生成没做异步,页面加载慢到崩溃
图片搜索 按文件名、上传时间、标签等条件筛选 SQL 没加索引,数据量一上去就卡死
图片删除 单张删除或批量删除,同时清理磁盘文件 只删了数据库记录,磁盘文件成了孤儿
图片详情 展示原图、EXIF 信息、上传时间等 EXIF 读取没做异常处理,遇到损坏图片直接 500

这些功能看起来简单,但组合起来就是一个完整的企业级应用雏形。我个人习惯把这种项目叫做「麻雀虽小,五脏俱全」。

核心思路: 我们不会一次性把所有功能都做完,而是每章迭代一个模块。第一章先把地基打牢,后面你自然会发现,前面的设计决定了后面的开发效率。

1.2 技术选型:为什么是 Python + Flask + SQLite?

你可能要问:市面上框架那么多,为什么选这三样?

我直接说结论:为了降低学习曲线,同时保留生产级扩展能力。

  • Python:语法简洁,生态丰富。图片处理有 Pillow,文件操作有 pathlib,几乎不用写太多胶水代码。
  • Flask:轻量、灵活。不像 Django 那样「全家桶」,Flask 让你自己选组件。我做过好几个内部工具,Flask 都是首选,因为启动快、改起来也快。
  • SQLite:零配置、文件型数据库。对于单机应用或小团队工具,SQLite 完全够用。我曾经帮一个创业团队搭原型,SQLite 撑了半年才切到 PostgreSQL。

下面这张图,就是我们整个系统的技术架构:

图片资源管理系统技术架构图 用户(浏览器) Flask Web 框架 路由 / 视图 / 请求处理 业务逻辑层 图片处理 / 文件管理 / 数据校验 SQLite 数据库 本地文件系统 前端:HTML + CSS + JS 依赖:Pillow / pathlib

我的建议: 如果你以后要上生产环境,把 SQLite 换成 PostgreSQL,Flask 前面加个 Nginx 反向代理,这套架构可以直接扛住日均几万次的图片请求。

1.3 搭建开发环境:一步一步来

环境搭建这件事,看起来简单,但版本不对真的能折腾死人。我记得有一次帮同事排查问题,搞了半天发现他装的是 Python 2.7……

下面我列一个清单,你照着做就行:

  1. 安装 Python 3.8+(推荐 3.10 或 3.11)
  2. 创建虚拟环境(venv 或 conda 都行)
  3. 安装 Flask 和依赖
  4. 验证环境是否正常

1.3.1 安装 Python

去 python.org 下载对应系统的安装包。安装时记得勾选「Add Python to PATH」。

验证方法:打开终端,输入:

python --version
# 输出示例:Python 3.11.4

注意: Windows 用户如果装了多个 Python 版本,建议用 py -3.11 指定版本。我曾经见过有人系统里同时有 Python 2.7、3.8、3.10,结果 pip 装到了错误的版本上。

1.3.2 创建虚拟环境

虚拟环境的作用,说白了就是给每个项目一个独立的「小房间」,互不干扰。

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS / Linux:
source venv/bin/activate

# 激活后,终端前面会出现 (venv) 字样

1.3.3 安装 Flask 和依赖

我们先把核心依赖装上。后面每章会逐步添加新的库。

pip install flask==3.0.0
pip install Pillow==10.1.0

你可以用 pip list 查看已安装的包。我个人习惯把依赖写进 requirements.txt,方便团队复现:

pip freeze > requirements.txt

生成的 requirements.txt 内容大概长这样:

Flask==3.0.0
Pillow==10.1.0
Werkzeug==3.0.1

1.3.4 验证环境:写一个最小 Flask 应用

我们来写一个最简单的 Flask 应用,确保所有东西都能跑起来。

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "图片资源管理系统已启动!"

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

运行它:

python app.py

打开浏览器,访问 http://127.0.0.1:5000。如果看到「图片资源管理系统已启动!」,恭喜你,环境搭建成功。

一个小技巧: debug=True 模式下,你改代码后 Flask 会自动重启,不用手动关掉再开。但生产环境千万别开 debug,会暴露敏感信息。

1.4 项目目录结构:从一开始就规整

很多新手喜欢把所有文件堆在根目录,项目一大了就乱成一锅粥。我建议从一开始就按功能分好目录:

image-manager/
├── app.py                 # 应用入口
├── requirements.txt       # 依赖清单
├── venv/                  # 虚拟环境(不提交到 Git)
├── static/                # 静态文件
│   ├── css/
│   ├── js/
│   └── images/
├── templates/             # HTML 模板
├── uploads/               # 用户上传的图片
└── database/              # SQLite 数据库文件

这个结构不是拍脑袋想的。我在实际项目中迭代过好几版,这个结构最平衡——既不会太扁平导致混乱,也不会太深导致路径难记。

避坑指南: 记得把 venv/ 和 uploads/ 加到 .gitignore 里。我曾经不小心把虚拟环境提交到 Git 仓库,结果 repo 体积直接飙到 200MB……

1.5 本章小结

这一章我们做了三件事:

  • 搞清楚了图片资源管理系统的核心功能模块
  • 确定了技术栈:Python + Flask + SQLite
  • 搭建了开发环境,跑通了第一个 Flask 应用