How do I split Flask models out of app.py without passing db object all over?

烂漫一生 提交于 2019-11-29 04:09:47

Partitioning such a small application into modules is tricky, because you find a lot of cases where the two modules that you create need to mutually import each other, creating circular dependencies.

I recommend that you look at how you can structure a larger application properly, using an app factory function and delayed initialization of all extensions. An example application that does this is the Flasky app featured in my book.

All that said, it is possible to separate the application into two parts, you just need to be careful with where you place the import statements. In the example below, I decided to move the creation of the db instance and the User model into a models.py file.

Here is the main application's module:

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()

And here is 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))

Here the main module will create app, and only then will import models.py. When models.py tries to import app from the main module, it has already been created. If you move from models import db to the top of the file with the other imports this code breaks.

aliasm2k

Here is an idea. You can create a package model in which you define classes as individual .py files. For example, user.py contains the User class.

In the __init__.py file you can define the db variable. You may also include from user import User statement so that it would be possible to access User object directly outside the package. For example you can import the model package somewhere else in the program using import model and then use model.User to directly use the User class.

To use db variable directly in the user.py use from ..model import db which imports db variable defined in the __init__.py file.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!