[英]Right way for initializing SQLAlchemy
许多教程都说使用Flask(__name__)
创建一个应用程序,然后我们可以用SQLAlchemy(app)
初始化数据库。 但是,我不喜欢这种侵入式模型,因为应用程序本身不需要了解有关数据库的任何信息。
我认为更好的方法是创建一个名为database
的模块并在那里初始化数据库。
模型应该import db from database
,应用程序应该只导入模型。
但是,使用这种方法,数据库模块必须以某种方式检索全局应用程序,这是我不同意的。
有没有一种属性方法来初始化数据库而不导入主应用程序?
这是我找到设置烧瓶应用程序的最好方法:
在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但是在我看来它会更不干净。
要使用我,然后从扩展文件导入数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.