ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Flask项目启动总报错?这10个常见坑我帮你踩过了

Flask项目启动总报错?这10个常见坑我帮你踩过了

⚠️免责声明:本文项目仅供技术学习参考,严禁直接作为毕业设计或课程作业提交。请结合自身需求进行二次开发与创新,学术诚信从我做起 🙂


直接说怎么跑起来

很多同学代码写得还行,一到环境搭建就懵——Python版本不对、依赖装不上、启动报错、数据库连不上。

拢共就四步:先装Python,再给项目整个虚拟环境,pip装依赖,最后flask run。听着没几步,每一步我都栽过。

但每一步都有坑。

流程我按自己踩过的顺序重排了一遍,跟着敲,正常十来分钟能跑起来——慢也就慢在下载依赖那步。


一、环境准备清单

先把需要的工具列出来,一个一个装好:

工具版本要求用途
Python3.8 ~ 3.12运行环境
pip最新版Python包管理
MySQL(可选)5.7 / 8.0数据库(SQLite可选跳过)
编辑器VS Code / PyCharm写代码
浏览器Chrome / Edge测页面

为什么Python 3.8 ~ 3.12?

低于3.8很多新特性用不了,高于3.12有些第三方库还没兼容。中间版本最稳。毕设推荐 3.10 或 3.11。


二、Windows 下 Python 安装

1. 下载

去 Python 官网下载:https://www.python.org/downloads/

选 Windows installer (64-bit),下载 .exe 安装包。

2. 安装

注意第一步最关键:勾选Add Python to PATH。

这个不勾,后面命令行输python找不到,90% 的新手都栽在这一步。

然后点Install Now,默认安装就行。

3. 验证安装成功

打开 CMD(Win + R,输 cmd,回车),输入:

python --version

能输出版本号就是装好了。

如果提示 “‘python’ 不是内部或外部命令”,说明PATH没配好,回去重新勾上或者手动加环境变量。


三、虚拟环境:隔离项目依赖

为什么要用虚拟环境?

因为不同项目依赖的库版本不一样——A项目用 Flask 2.x,B项目用 Flask 1.x,混在一起会打架。虚拟环境让每个项目有自己独立的依赖包,互不干扰。

创建虚拟环境

打开 CMD,进到项目目录:

cd D:\myd_shop python -m venv venv

这行会在项目目录下创建一个venv文件夹,里面就是这个项目的独立 Python 环境。

激活虚拟环境

venv\Scripts\activate

激活成功后,命令行前面会出现(venv)的标识。

退出虚拟环境:

deactivate

Mac / Linux 用户

cd/your/project/path python3-mvenv venvsourcevenv/bin/activate

四、安装项目依赖

项目根目录下应该有个requirements.txt,列出了所有依赖包:

Flask==3.0.0 Flask-SQLAlchemy==3.1.1 Flask-Login==0.6.3 Flask-WTF==1.2.1 Werkzeug==3.0.1 PyMySQL==1.1.0 Pillow==10.1.0 captcha==0.4

一键安装:

pip install -r requirements.txt

依赖安装常见坑

坑1:下载太慢,超时

用国内镜像源加速:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

常用的国内镜像:

  • 清华:https://pypi.tuna.tsinghua.edu.cn/simple
  • 阿里云:https://mirrors.aliyun.com/pypi/simple/
  • 中科大:https://pypi.mirrors.ustc.edu.cn/simple/

坑2:提示 “Microsoft Visual C++ 14.0 is required”

有些包(比如 Pillow、cryptography)需要编译环境。

解决方法:去微软官网下载 “Build Tools for Visual Studio”,安装时勾选 “C++ 生成工具”。或者直接下载对应包的 whl 文件手动安装。

坑3:版本冲突

如果报 “ERROR: Cannot install … because these package versions have conflicting dependencies”,那就是依赖版本冲突了。

解决方法:先看冲突的是哪两个包,然后调整requirements.txt里的版本号,找到都兼容的版本。

坑4:pip 版本太低

先升级 pip:

python -m pip install --upgrade pip

然后再装依赖。


五、数据库配置

毕设推荐两种方案,选一个就行:

方案A:SQLite(最简单,零配置)

SQLite 是文件数据库,不需要装服务,一个文件就是整个数据库。毕设演示完全够用。

配置:

# config.pyimportos BASE_DIR=os.path.abspath(os.path.dirname(__file__))classConfig:SECRET_KEY='your-secret-key-here-change-it'SQLALCHEMY_DATABASE_URI='sqlite:///'+os.path.join(BASE_DIR,'myd_shop.db')SQLALCHEMY_TRACK_MODIFICATIONS=False

优点:不用装数据库软件,项目复制到哪都能跑
缺点:并发差(毕设不影响),功能比 MySQL 少

方案B:MySQL(正式一点)

如果答辩老师要求用 MySQL,就用这个。

先装 MySQL(推荐 MySQL 8.0),装完创建数据库:

CREATEDATABASEmyd_shopDEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_general_ci;

配置:

classConfig:SECRET_KEY='your-secret-key-here'SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:你的密码@localhost:3306/myd_shop?charset=utf8mb4'SQLALCHEMY_TRACK_MODIFICATIONS=False

MySQL 常见坑:

坑1:连接不上,报 Access denied

检查用户名密码对不对、MySQL 服务有没有启动。Windows 下可以在服务里看 MySQL 服务状态。

坑2:报 2003 Can’t connect to MySQL server

MySQL 没启动。去服务里启动 MySQL,或者命令行net start mysql80。

坑3:报 “Unknown charset ‘utf8mb4’”

MySQL 版本太低了,5.5.3 以上才支持 utf8mb4。升级 MySQL,或者把 charset 改成 utf8。

坑4:中文乱码

确保数据库、表、连接都是 utf8mb4。连接串里加上?charset=utf8mb4。


六、初始化数据库表

第一次跑项目,数据库里是空的,需要建表。

方式1:直接执行建表 SQL

把第一篇里的建表 SQL 全部复制到 Navicat 或 phpMyAdmin 里执行。

方式2:用 Flask-Migrate 自动迁移

更专业的做法,用flask db命令自动生成和执行迁移。

# app.py 里初始化fromflask_migrateimportMigratefrommodelsimportdb migrate=Migrate(app,db)

然后命令行执行:

flask db init # 初始化迁移目录(第一次才需要) flask db migrate -m "init" # 生成迁移文件 flask db upgrade # 执行迁移,建表

以后加字段、改表结构,就再跑flask db migrate和flask db upgrade。

答辩时我提了句"用的Flask-Migrate做迁移",老师果然多问了两句表结构怎么改的——这个词值几分印象分。

方式3:代码里直接 create_all

最简单粗暴:

# app.py 最后加withapp.app_context():db.create_all()

应用启动时自动建表。缺点是改表结构的时候不会自动更新,适合项目初期快速跑起来。


七、创建管理员账号

后台管理需要一个管理员账号,写个初始化脚本:

# init_admin.pyfromappimportapp,dbfrommodelsimportAdminfromwerkzeug.securityimportgenerate_password_hashwithapp.app_context():# 检查是否已有管理员ifAdmin.query.filter_by(username='admin').first():print('管理员已存在')else:admin=Admin(username='admin',password=generate_password_hash('admin123'),role='super')db.session.add(admin)db.session.commit()print('管理员创建成功:admin / admin123')

运行:

python init_admin.py

毕设演示的时候,管理员账号密码简单点就行——admin / admin123,记起来方便。


八、启动项目

开发模式启动

set FLASK_APP=app.py set FLASK_DEBUG=True flask run

Mac / Linux:

exportFLASK_APP=app.pyexportFLASK_DEBUG=True flask run

或者直接在app.py底部写:

if__name__=='__main__':app.run(debug=True,host='0.0.0.0',port=5000)

然后直接python app.py就行。

host='0.0.0.0'的意思是允许局域网访问——答辩的时候老师想用他自己的电脑访问你的项目,用这个就能通过你的IP访问。

访问地址

打开浏览器,输入:

  • 前台首页:http://127.0.0.1:5000/
  • 后台管理:http://127.0.0.1:5000/admin/login

九、常见启动报错排查

报错1:ModuleNotFoundError: No module named 'flask'

原因:没装依赖,或者没激活虚拟环境。

解决:先激活虚拟环境(venv\Scripts\activate),再pip install -r requirements.txt。

报错2:ImportError: cannot import name 'secure_filename' from 'werkzeug.utils'

原因:Werkzeug 版本太新,secure_filename移到了werkzeug.utils下面的别的位置(其实新版本还在 utils 里,这个一般是版本不兼容)。

解决:降低 Werkzeug 版本pip install werkzeug==2.3.7,或者按 Flask 版本对应的 Werkzeug 版本装。

报错3:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: user

原因:数据库里没有表,还没初始化。

解决:执行建表 SQL 或者跑db.create_all()。

报错4:Address already in use

原因:5000 端口被占用了——可能上一个 Flask 进程没关掉。

解决:

  • Windows:netstat -ano | findstr :5000找到 PID,然后taskkill /F /PID 进程号
  • Mac/Linux:lsof -i :5000找到 PID,kill -9 进程号
  • 或者换个端口:flask run --port 5001

报错5:OSError: [WinError 10013]以一种访问权限不允许的方式做了一个访问套接字的尝试

原因:端口被系统占用或权限不够。

解决:换个端口,比如 8000、8080。

报错6:jinja2.exceptions.TemplateNotFound

原因:模板文件找不到——路径错了,或者文件名不对。

解决:确认 templates 文件夹在正确的位置(app.py 同级目录),模板路径写对了。

报错7:图片上传不了 / 上传后不显示

原因:上传目录不存在 / 路径配置错了 / 静态文件路由没配置。

解决:

  1. 确保static/uploads/goods/目录存在
  2. Flask 自动服务 static 目录下的文件,路径应该是/static/uploads/goods/xxx.jpg
  3. 检查 Nginx 或开发服务器的静态文件配置

十、毕设演示小贴士

1. 准备几个测试账号

提前注册几个普通用户账号,每个账号里放几个订单、购物车里加点东西,演示的时候直接看,不用现场注册。

2. 准备管理员登录入口

后台地址别藏太深,演示的时候好找。可以在前台页脚放个"管理后台"的链接。

3. 数据别太空

数据库里多塞点测试数据——十几个商品、几个分类、几轮播图、几个订单。页面看起来饱满,老师第一印象好。

4. 用 PyCharm 演示加分

能在 PyCharm 里跑起来,随时能打开代码给老师看,比单纯打开网页效果好得多。

5. 固定启动步骤写成脚本

写个run.bat(Windows)或run.sh(Mac),一键启动,演示的时候不用手敲命令:

@echo off call venv\Scripts\activate set FLASK_APP=app.py set FLASK_DEBUG=True python app.py pause

双击就启动,多省事。


启动报错相关,答辩会问什么

1. 为什么要用虚拟环境?

答:虚拟环境可以为每个项目创建独立的Python依赖环境,避免不同项目之间包版本冲突。比如A项目用Flask 2.x,B项目用Flask 3.x,放在同一个全局环境里就会冲突。

2. requirements.txt 是干嘛的?怎么生成?

答:requirements.txt 是项目依赖清单,列出了所有需要安装的Python包及其版本。别人拿到项目后,pip install -r requirements.txt就能一键安装所有依赖。生成命令是pip freeze > requirements.txt。

3. Flask 的 debug 模式有什么用?为什么生产环境不能开?

答:开发时开着确实方便,改完代码自动重启,报错页还能直接看详细堆栈。但线上必须关掉debug——你想啊,那个交互式调试器谁都能在上面敲Python代码,等于把服务器钥匙挂网上了。

4. 为什么数据库连接用配置文件不直接写死在代码里?

答:配置和代码分离是最佳实践——开发环境、测试环境、生产环境的数据库地址、密码都不一样,用配置文件可以根据环境切换,不用改代码。密码等敏感信息也不应该提交到代码仓库里。

5. 数据库迁移工具有什么用?

答:数据库迁移工具(如 Flask-Migrate / Alembic)可以追踪数据库表结构的变化,生成迁移脚本,支持升级和回滚。项目迭代过程中表结构会不断变化(加字段、改类型),用迁移工具可以有序地管理这些变化,也方便在不同环境之间同步表结构。


环境搭建挺邪门,会的人闭着眼装完,不会的人光一个PATH就能卡半天,我当初就卡过。

其实就那么几个固定的坑,踩过一次就记住了。

上面这些我挨个踩过,照着走基本能起得来;真卡住了,回第九节对着报错表对号入座就行。


梅雅达编程笔记原创 · 首发 CSDN · 转载请注明出处

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进