当前位置:  开发笔记 > 编程语言 > 正文

如何在不传递db对象的情况下将Flask模型从app.py中分离出来?

如何解决《如何在不传递db对象的情况下将Flask模型从app.py中分离出来?》经验,为你挑选了1个好方法。

我想使用Flask-Migrate并查看他们的示例:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

db = SQLAlchemy(app)
migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))

if __name__ == '__main__':
    manager.run()

这作为一个简单的播放示例很有用,但我有多个模型,我不想在这个脚本和定义我的应用程序代码的模型中定义模型.因此,我想将它们拉入我可以在两者之间共享的模型文件中.

我尝试通过将User类放入a models.py然后从那里导入User来尝试这样做.不幸的是,这会抛出一个NameError: name 'db' is not defined.

我的问题是:

我需要db = SQLAlchemy(app)在my models.py中使用吗?如果是这样,我的迁移脚本和烧瓶应用程序本身都可以使用吗?

如果我不能(或不应该)将其放入models.py,我如何在不通过db所有文件的情况下在自己的文件中使用我的模型?

Miguel.. 17

将这么小的应用程序分区到模块中是很棘手的,因为您发现很多情况下您创建的两个模块需要相互导入,从而创建循环依赖项.

我建议你看一下如何使用app工厂函数和所有扩展的延迟初始化来正确构建更大的应用程序.这样做的一个示例应用程序是我书中的Flasky应用程序.

总而言之,可以将应用程序分成两部分,您只需要小心放置import语句的位置即可.在下面的示例中,我决定将db实例和User模型的创建移动到models.py文件中.

这是主要应用程序的模块:

from flask import Flask
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

from models import db  # <-- this needs to be placed after app is created
migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

这是models.py:

from __main__ import app
from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))

这里主模块将创建app,然后才会导入models.py.当models.py尝试app从主模块导入时,它已经被创建.如果您from models import db使用其他导入移动到文件的顶部,则此代码会中断.



1> Miguel..:

将这么小的应用程序分区到模块中是很棘手的,因为您发现很多情况下您创建的两个模块需要相互导入,从而创建循环依赖项.

我建议你看一下如何使用app工厂函数和所有扩展的延迟初始化来正确构建更大的应用程序.这样做的一个示例应用程序是我书中的Flasky应用程序.

总而言之,可以将应用程序分成两部分,您只需要小心放置import语句的位置即可.在下面的示例中,我决定将db实例和User模型的创建移动到models.py文件中.

这是主要应用程序的模块:

from flask import Flask
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

from models import db  # <-- this needs to be placed after app is created
migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

这是models.py:

from __main__ import app
from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))

这里主模块将创建app,然后才会导入models.py.当models.py尝试app从主模块导入时,它已经被创建.如果您from models import db使用其他导入移动到文件的顶部,则此代码会中断.


我理解你的例子,但如果我想要的是将models.py分成不同的.pys怎么办?例如User.py,Foo.py,Bar.py.我很难找到办法做到这一点.
在调用`db.create_all()`之前,必须导入所有模型.
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有