许多教程都说要使用Flask(__name__)
创建一个应用程序,然后我们可以使用SQLAlchemy(app)
初始化数据库。
但是,我不喜欢这种侵入性模型,因为应用程序本身不需要了解任何有关数据库的信息。
我认为更好的方法是创建一个名为database
的模块并在那里初始化数据库。
模型应import db from database
,应用程序应仅导入模型。
但是,采用这种方法,数据库模块必须以某种方式检索全局应用程序,这是我不同意的。
是否存在一种无需导入主应用程序即可初始化数据库的属性方法?
答案 0 :(得分:0)
这是我发现设置烧瓶应用程序的最简洁的方法:
在app.py中:
from flask import Flask
from app.settings import DevConfig
from app.extensions import api, mysqldb, marsh, mongodb
def create_app(config=DevConfig):
"""Application factory. This is used to run the app from the root.
:param config: Object to configure app stored in settings.py
"""
app = Flask(__name__.split('.')[0])
app.config.from_object(config)
register_endpoints()
register_extensions(app)
return app
def register_extensions(app):
"""Registration of flask components."""
mysqldb.init_app(app)
marsh.init_app(app)
mongodb.init_app(app)
api.init_app(app)
然后在extensions.py中,我会有类似的内容:
from flask_restful import Api
from flask_httpauth import HTTPBasicAuth
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from flask_pymongo import PyMongo
mysqldb = SQLAlchemy()
mongodb = PyMongo()
marsh = Marshmallow()
api = Api(prefix='/v1')
auth = HTTPBasicAuth()
这样,我的事情就分开了。可能有一种方法可以在扩展中循环init_app,但是我认为这样不太干净。
要使用,我然后从扩展文件中导入数据库。