在Flask中组织蓝图特定的配置

时间:2019-06-26 09:52:42

标签: python flask flask-sqlalchemy

当前,我正在尝试为公司创建一个内部应用程序,该应用程序将不同的用例捆绑到一个应用程序中。这也意味着每个用例可能会有不同的配置。

我决定用Blueprints组织Flask应用程序,SQL语句是用SQLAlchemy触发的,但是我不知道是如何为每个Blueprint使用不同的数据库将其传递给SQLAlchemy。还是在一个配置中将其与多个绑定一起使用的最佳方法?

请分享您的经验。

在此先谢谢Thomas,

1 个答案:

答案 0 :(得分:0)

我玩了一会儿,为我找到了可行的解决方案。我将绑定用于特定于蓝图的数据库。

(对我来说)这是它的工作原理,即使有人可能对相同的问题感兴趣或在同一问题上挣扎。

  1. 在某些./app/config.py脚本中添加数据库配置
class Config():

    #Secret key
    SECRET_KEY = 'you_never_know'


    SQLALCHEMY_BINDS = {
        'database': 'mysql+mysqlconnector://user:password@localhost/database'
    }
    SQLALCHEMY_TRACK_MODIFICATIONS = False
  1. 在您的./app/__init__.py中,请执行以下操作:
from flask import Flask
from .config import Config

app = Flask(__name__)
app.config.from_object(Config)

with app.app_context():
    from .somewhat_app import bp as somewhat_bp
    app.register_blueprint(somewhat_bp)
  1. ./app//somewhat_app/__init__.py
from flask import Blueprint

bp = Blueprint('somewhat', __name__, url_prefix='/somewhat')

from . import somewhat
  1. ./app/somewhat_app/somewhat.py
from . import bp
from flask import (
    render_template, request, url_for, jsonify, make_response
)
from flask import current_app as app

from .model import MyTable

@bp.route('/')
def index():
    resp = MyTable.query.limit(20).all()
    return render_template('somewhat/index.html', resp=resp)
  1. ./app/somewhat_app/model.py
from flask import current_app as app
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)
db.reflect(bind='database')

class MyTable(db.Model):
    __bind_key__ = 'database'
    __table__ = db.metadata.tables['mytable']