无法从forms.py导入NamerForm至controllers.py,出现ImportError
Flask导入NamerForm报错:ImportError: cannot import 'NamerForm' from 'application.forms'
问题详情
无法从forms.py向controllers.py导入NamerForm,报错信息:
ImportError: cannot import 'NamerForm' from 'application.forms'
移除controllers.py中的name函数后,应用可正常运行。
文件目录结构
.venv |____applications |-__init__.py |-config.py |-controllers.py |-forms.py |____templates |-name.html |____static |____main.py
相关代码
main.py
from flask import Flask import os, application.config from application.config import LocalDevelopmentConfig from application.database import db app = None def create_app(): app = Flask(__name__, template_folder='templates', static_folder='static') app.config['SECRET_KEY']='somekey' if os.getenv('ENV',"development") == "production": raise Exception("Currently no production config is set up.") else: print("Starting Local Development") app.config.from_object(LocalDevelopmentConfig) db.init_app(app) app.app_context().push() return(app) app = create_app() from application.controllers import * if __name__ == '__main__': app.run(host='127.0.0.1', port=8080)
forms.py
from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired class NamerForm(FlaskForm): name = StringField("write something", validators=[DataRequired()]) submit = SubmitField("Submit")
controllers.py
from flask import Flask,render_template, url_for from flask import current_app as app #from app import app from .forms import NamerForm #---other app routes-------- @app.route("/name", methods = ['GET', 'POST']) def name(): name = None form = NamerForm() if form.validate_on_submit(): name = form.name.data form.name.data = '' return(render_template("name.html", name = name, form = form))
解决方案
核心问题:包名拼写不一致
你的文件目录里是applications(复数,末尾带s),但代码里所有导入都用的是application(单数,不带s),这直接导致Python找不到对应模块,引发导入错误。
修复步骤
统一包名拼写
两种选择二选一:- 若保留文件夹名
applications,将所有代码中的application替换为applications:- main.py中修改导入语句:
import os, applications.config from applications.config import LocalDevelopmentConfig from applications.database import db # ... from applications.controllers import * - controllers.py中可使用绝对导入:
from applications.forms import NamerForm
- main.py中修改导入语句:
- 若希望代码中用
application,将文件夹applications重命名为application。
- 若保留文件夹名
确认__init__.py存在
确保包文件夹下有__init__.py文件(空文件即可),Python才能识别它为合法包。验证依赖安装
确保已安装flask-wtf,执行命令:pip install flask-wtf
验证修复
修改完成后重启应用,访问/name路径,表单应能正常加载,不再出现导入错误。
内容的提问来源于stack exchange,提问作者HS077
相关产品推荐
相关产品推荐

