Python 烧瓶错误:ImportError无法导入名称';app&x27;从';app&x27;
我刚开始学习Flask,我正在构建我的第一个应用程序。 其想法是制作一个简单的应用程序,我可以将其存储在SQLite的学生、班级和教师中 为了实现这一点,我只编写了两个python文件: app.py->创建应用程序并定义路由 models.py->创建数据库模型以存储它们 不知何故,当我尝试将应用程序导入模型时,会出现以下错误:Python 烧瓶错误:ImportError无法导入名称';app&x27;从';app&x27;,python,sqlite,flask,Python,Sqlite,Flask,我刚开始学习Flask,我正在构建我的第一个应用程序。 其想法是制作一个简单的应用程序,我可以将其存储在SQLite的学生、班级和教师中 为了实现这一点,我只编写了两个python文件: app.py->创建应用程序并定义路由 models.py->创建数据库模型以存储它们 不知何故,当我尝试将应用程序导入模型时,会出现以下错误: 回溯(最近一次呼叫最后一次): 文件“/Users/thiago/coding/eu-decidi/lib/python3.7/site-packages/flas
回溯(最近一次呼叫最后一次):
文件“/Users/thiago/coding/eu-decidi/lib/python3.7/site-packages/flask/cli.py”,第240行,在locate_应用程序中
__导入(模块名称)
文件“/Users/thiago/coding/eu-decidi/app.py”,第6行,在
从模型导入学生、教师、会议、学生标识符
文件“/Users/thiago/coding/eu-decidi/models.py”,第1行,在
从应用程序导入应用程序
导入错误:无法从“app”导入名称“app”(/Users/thiago/coding/eu decidi/app.py)
创建主文件夹,将除“app.py”文件外的所有文件和文件夹移动到该主文件夹中。保存然后运行。乍一看,这可能是一个循环导入操作,因为在定义app
之前需要尝试导入app
的models
。然而,我想指出,你的应用程序结构可以改进,使应用程序更容易理解。以下是我通常如何构建flask应用程序:
run.py
(应用程序入口点)
venv
(虚拟环境)
decidi
(您的应用程序包中的每个.py文件都可以作为包的一个模块导入)
-----\uuuu init\uuuuu.py
(Python将此文件名视为包并将整个文件夹视为包)
-----models.py
-----模板
----------index.html
-----static
(提供css和图像等静态文件)
在
run.py
中,它非常简单。它会从应用程序包中导入应用程序,在您的情况下是,decidi
from decidi import app
if __name__ == '__main__':
app.run(debug=True)
在decidi/\uuuuu init\uuuuuuuy.py
中,您可以将自己拥有的东西放在app.py中。请注意,模型的导入必须在db
初始化后完成,否则将导致循环导入。某些编辑器可能会自动移动导入,在这种情况下,您需要关闭该功能
from flask import Flask, render_template, request, url_for, redirect, flash
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) #application instance
app.config['SECRET_KEY']= 'my_secret'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myDB.db' #path to database and its name
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #supress warning of changes on database
db = SQLAlchemy(app) #database instance
from decidi.models import Student # DO NOT PUT THIS AT THE TOP
@app.route('/')
@app.route('/index')
def index():
return render_template("index.html")
在decidi/models.py
中,您可以直接从您的应用程序包导入db
,因为它位于包的\uuuu init\uuuuuu.py
内:
from decidi import db
class Student(db.Model):
#__tablename__ = 'student'
student_id = db.Column(db.Integer, primary_key = True) #primary Key column, automatically generated IDs
student_name = db.Column(db.String(80), index = True, unique = False) #name of student
student_surname = db.Column(db.String(100), index = True, unique = False) #surname of student
student_phone = db.Column(db.Integer, index=True, unique = True) #student phone number
student_email = db.Column(db.String(200), index=True, unique = True) #student email
def __repr__(self):
return "Aluno: {} {}, telefone: {}".format(self.student_name,self.student_surname,self.student_phone)
要运行应用程序,请将cd放入run.py
所在的目录,激活虚拟环境,然后只需python3 run.py
为了简单起见,我只保留了大部分代码。但要点就在这里。如果这造成了混乱,请随时在评论中询问我。请回答您的问题,并将错误全文和回溯放在一起。从.app import app尝试
。非常感谢阿古斯丁,刚刚尝试过,它真的很有效,而且使用起来更加干净!