使用app factory flask时,在单独的文件中定义模型

时间:2018-05-01 07:11:59

标签: flask flask-sqlalchemy

我正在使用app工厂方法创建一个烧瓶应用程序。我在应用程序文件夹__init__.py中有一个文件,其中create_app函数包含以下代码

def create_app(test_config=None):
app = Flask(__name__,instance_relative_config=True)
app.config.from_mapping(
        SECRET_KEY='dev',
    )

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@localhost/database'
db = SQLAlchemy(app)

if test_config == None:
    app.config.from_pyfile('config.py',silent=True)
else:
    app.config.form_mapping(test_config)

from flaskr import models

try:
    os.makedirs(app.instance_path)
except OSError:
    pass

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

@app.route('/hello')
def hello():
    return json.dumps({'message':'hello','status':True})
@app.route('/getusers')
def getusers():
    u = User.query.get(1)
    return json.dumps({'uname':u.uname})

return app

我想要的是在单独的文件中定义模型。我怎样才能做到这一点? 我尝试在单独的文件中定义并导入它。但问题是模型继承了db.Model,然后在导入的文件中不可用。

2 个答案:

答案 0 :(得分:1)

db对象的创建保留在create_app之外,而不传递任何app实例,并使用SQLAlchemy.init_app方法进行配置和初始化。您的db对象,这样您可以从任何文件中import

db = SQLAlchemy()
#...
def create_app(test_config=None):
    app = Flask(__name__,instance_relative_config=True)
    #...
    db.init_app(app)

有关此主题的更多信息,请访问flask's documentation

答案 1 :(得分:0)

我也为这个问题奋战了几个小时。在我意识到必须将应用退回app.app_context()

之前,无法修复它

model.py

from flask_user import UserMixin
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

    email = db.Column(db.String(255, collation='NOCASE'), nullable=False,
                      unique=True)
   # ...

__init__.py

from flask import Flask
from flask_migrate import Migrate

def create_app(test_config=None):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_pyfile('config.py', silent=True)

    migrate = Migrate()

    from appname.model import db
    db.init_app(app)
    migrate.init_app(app, db)

    with app.app_context():
        # Create all database tables
        db.create_all()

        import appname.routes

        # Apply the blueprints to the app
        from appname import bp1, bp2

        appname.register_blueprint(bp1.bp)
        appname.register_blueprint(bp2.bp)

        return app

运行方式:

cd ~/Folder/Webapp
. appname/bin/activate
export FLASK_APP=appname
export FLASK_ENV=development
flask run

(在Linux终端中)

或创建此文件并在python shell中运行:

from appname import create_app

if __name__ == '__main__':
    app = create_app()
    app.run(debug=True)