如何在Django中构建Flask应用程序?

时间:2013-06-03 21:40:43

标签: python flask

我已经从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中实例化,我该如何访问它?如果我只是导入它,我会得到一个交叉引用错误。

2 个答案:

答案 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)