0

Flask(__name__)许多教程说要使用并从那里创建应用程序,我们可以使用SQLAlchemy(app). 但是,我不喜欢这种侵入式模型,因为应用程序本身不需要了解有关数据库的任何信息。

我认为更好的方法是创建一个名为database并在那里初始化数据库的模块。

模型应该import db from database和应用程序应该只导入模型。

但是,使用这种方法,数据库模块必须以某种方式检索全局应用程序,这是我不同意的。

是否有一种属性方法可以在不导入主应用程序的情况下初始化数据库?

4

1 回答 1

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 ,但在我看来它会不那么干净。

要使用我然后从扩展文件中导入数据库。

于 2019-06-09T19:21:11.263 回答