我已经从Django切换到Flask进行了一个项目,并且有点失去了如何在Django中设置类似的结构。
在我的烧瓶示例中,所有内容都可以在一个文件中正常工作,但是当我尝试将模型拉入自己的类时,我遇到了交叉引用问题而无法解决它。
F11.py
app = Flask(__name__)
db = SQLAlchemy(app)
...
if __name__ == "__main__":
app.run()
models.py
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
password = db.Column(db.String)
问题已经从db.Model
开始了。 db
在主F11.py
中实例化,我该如何访问它?如果我只是导入它,我会得到一个交叉引用错误。
答案 0 :(得分:2)
一般来说,我喜欢以这样的方式构建我的应用程序,使得您不需要在任何文件中import app
。对于我当前的项目,导入应用程序的唯一文件是一个名为manage.py
的文件,它只允许我使用Flask-Script执行某些操作。
许多Flask扩展的一个很好的功能是init_app
方法。这允许您在不需要app对象的情况下实例化应用程序的扩展。
假设您在名为db
的文件中设置了名为db.py
的数据库。这可能看起来像
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
我们进一步说,您在__init__.py
中设置了应用。此文件可能类似于
from flask import Flask
from app.db import db
app = Flask(__name__)
db.init_app(app)
# ...
现在,您的数据库已针对Flask应用程序进行初始化,当您通过from app.db import db
直接导入数据库时,您将不会遇到循环引用问题,例如models.py
。
对于我的观点,我经常回复蓝图而不是使用@app.route('/')
方法。就像数据库一样,蓝图可以简单地导入到您的__init__.py
文件中,并在那里注册到应用程序。
答案 1 :(得分:1)
我通常将初始化放在主项目文件夹下的__init__.py
中。
__init__.py
app = Flask(__name__)
db = SQLAlchemy(app)
import myproject.views
import myproject.models
models.py
from myproject import app
from myproject import db
class User(db.Model):
runserver.py
(提升一级)
from myproject import app
app.run(debug=True)