虚拟环境运行Flask报ModuleNotFoundError:flask_wtf不存在
Flask运行提示flask_wtf模块不存在问题排查
问题背景
激活虚拟环境开发基础Flask应用,已多次在虚拟环境内安装、更新包括Flask-WTF在内的全部依赖,项目共包含三个核心Python文件:主应用入口文件、路由配置文件、表单定义文件。通过Git Bash运行项目时,所有Python文件均抛出脚本错误,提示Flask-WTF模块不可用。
相关代码片段
主应用入口文件
from flask import Flask app = Flask(__name__) app.config['SECRET_KEY'] = 'aaa - key' #key to generate CSRF token from route import * if __name__ == '__main__': app.run (debug=True)
路由配置文件
from app import app from flask import render_template import forms @app.route('/') @app.route('/page1') def page1(): return render_template ('page1.html', current_title='Head 1') @app.route('/page2', methods=['GET', 'POST']) def page2(): form = forms.AddTaskForm() if form.validate_on_submit(): print('Submitted',form.title.data) return render_template('page2.html', form=form, title=form.title.data) return render_template ('page2.html', form=form)
表单定义文件
from wsgiref.validate import validator from flask_wtf import Form, FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired class AddTaskForm(FlaskForm): title = StringField('Title', validators=[DataRequired()]) submit = SubmitField('Send')
报错信息
app.py", line 6, in <module> route.py", line 7, in <module> forms.py", line 2, in <module> from flask_wtf import FlaskForm ModuleNotFoundError: No module named 'flask_wtf'
修复方案
优先解决模块找不到的核心问题
90%以上的这类问题都是Git Bash中虚拟环境未实际生效导致的,Windows环境下Git Bash的路径映射和虚拟环境激活脚本适配经常出现激活成功的假提示,实际调用的还是全局Python解释器:
- 在当前运行项目的Git Bash窗口执行
where python,查看输出的Python解释器路径,如果路径不是你虚拟环境目录下的Scripts/python.exe,说明虚拟环境激活失败,之前安装的Flask-WTF都装到了全局环境中,运行时自然找不到。 - 确认解释器路径正确后,执行
pip list检查已安装包列表,如果列表中没有Flask-WTF,重新执行pip install flask-wtf安装即可。
修复代码中存在的其他隐性问题
就算模块问题解决,现有代码还有两处会导致运行报错的问题,需要同步修正:
- 表单定义文件缩进错误+冗余导入
类属性必须相对class定义缩进4个空格,同时删除无关的冗余导入,修正后的表单文件代码如下:
from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired class AddTaskForm(FlaskForm): title = StringField('Title', validators=[DataRequired()]) submit = SubmitField('Send')
说明:原代码中
from wsgiref.validate import validator是Python标准库中WSGI校验相关的工具,和WTForms表单校验没有任何关系,属于无效导入;Flask-WTF 0.13及以上版本已经废弃旧的Form类,无需重复导入,直接使用FlaskForm即可。
- 规避循环导入风险
现有代码在app.py中初始化app实例后导入路由,路由文件又反向导入app实例,小项目下暂时可以运行,但后续扩展功能时很容易触发循环导入报错,建议后续可以将app实例初始化逻辑单独拆分到独立文件中。
内容的提问来源于stack exchange,提问作者Banerjee Anirban
相关产品推荐
相关产品推荐

