我有一个烧瓶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的用例特定问题,而实际上没有回答如何将任意参数传递给蓝图的问题。
答案 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