如何将任意参数传递给烧瓶蓝图?

时间:2015-02-20 23:37:44

标签: python oop flask arguments blueprint

我有一个烧瓶api,我把它包裹在一个物体里。这样做使得单元测试变得轻而易举,因为我可以使用各种不同的设置来实例化api,具体取决于它是在生产,测试还是生产中。

我现在正在尝试扩展api,为此我正在使用蓝图。问题是我无法弄清楚如何将参数传递给蓝图。我的路由需要访问哪些数据库等信息,并且该信息不是静态的。如何将此信息传递到蓝图中?我在下面列出了代码作为示例:

api.py:

class MyApi(object):
    def __init__(self, databaseURI):
     self.app = Flask(__name__)
     self.app.register_blueprint(myblueprint)

blueprint.py

myblueprint= Blueprint('myblueprint', __name__)
@myblueprint.route('/route', methods=['GET'])
def route():
  database = OpenDatabaseConnection(databaseURI)

这里有一个相关的问题: How do I pass constructor arguments to a Flask Blueprint?

但回答问题的人解决了op的用例特定问题,而实际上没有回答如何将任意参数传递给蓝图的问题。

3 个答案:

答案 0 :(得分:17)

您可以在构造函数中动态创建蓝图:

def construct_blueprint(database):

    myblueprint = Blueprint('myblueprint', __name__)

    @myblueprint.route('/route', methods=['GET'])
    def route():
        database = database

    return(myblueprint)

答案 1 :(得分:1)

另一种选择是使用 Flask config system 来存储您的所有配置数据,然后从您的蓝图中使用 current_app 读取您的 Application Context

存储在app.config

app.config[DATABASE_URI] = databaseURI

读取应用上下文:

databaseURI = current_app.config[DATABASE_URI]

示例代码

main.py

from flask import Flask
from blueprint import myblueprint

app = Flask(__name__)
app.register_blueprint(myblueprint)
app.config[DATABASE_URI] = databaseURI

蓝图.py

from flask import current_app

myblueprint= Blueprint('myblueprint', __name__)
@myblueprint.route('/route', methods=['GET'])
def route():
  databaseURI = current_app.config[DATABASE_URI]
  database = OpenDatabaseConnection(databaseURI)

答案 2 :(得分:0)

通过这种方法,可以在工厂内部添加传递参数的蓝图。有时您会需要它,而烧瓶文档中的任何地方都没有描述。

假设bp1.py,bp2.py与appname位于同一文件夹中

from appname import bp1, bp2

app.register_blueprint(bp1.bp)
# with parameters:
app.register_blueprint(bp2.construct_blueprint(arg1, arg2))

bp2.py内部:

def construct_blueprint(arg1, arg2):
    bp = Blueprint("bp2", __name__)

    @bp.route('/test')
    def test():
        ret = {'arg1': arg1, 'arg2': arg2}
        return jsonify(ret)

    return bp