4

我已经为一个项目从 Django 切换到 Flask,并且有点迷失如何设置类似 Django 的结构。

在我的烧瓶示例中,在单个文件中一切正常,但是当我什至尝试将模型拉入自己的类时,我遇到了交叉引用问题并且无法解决。

F11.py

app = Flask(__name__)
db = SQLAlchemy(app)

...

if __name__ == "__main__":
    app.run()

模型.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.Modeldb在 main 中实例化F11.py,那么我该如何访问它呢?如果我只是导入它,我会得到一个交叉引用错误。

4

2 回答 2

2

一般来说,我喜欢以您不需要import app在任何文件中的方式来构建我的应用程序。对于我当前的项目,导入应用程序的唯一文件是一个名为的文件,它只manage.py允许我使用 Flask-Script 做某些事情。

许多 Flask 扩展的一个很好的特性是init_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文件并在那里注册到应用程序。

于 2013-06-03T22:16:55.130 回答
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)
于 2013-06-03T21:48:24.227 回答