我正在使用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
,然后在导入的文件中不可用。
答案 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)