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

mel*_*r55 9 python oop arguments blueprint flask

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

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

api.py:

class MyApi(object):
    def __init__(self, databaseURI):
     self.app = Flask(__name__)
     self.app.register_blueprint(myblueprint)
Run Code Online (Sandbox Code Playgroud)

blueprint.py

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

这里有一个相关的问题: 如何将构造函数参数传递给Flask蓝图?

但是回答这个问题的人解决了op的用例特定问题而没有真正回答如何将任意参数传递给蓝图的问题.

syn*_*nym 19

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

def construct_blueprint(database):

    myblueprint = Blueprint('myblueprint', __name__)

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

    return(myblueprint)
Run Code Online (Sandbox Code Playgroud)

  • 什么阻止你将该函数放入模块然后使用它`myblueprint = module.construct_blueprint(database)`? (4认同)
  • 只有我最终的疲惫.谢谢你,先生. (4认同)
  • 好点子!我当然很感激。这里的问题是,我想使用蓝图的部分原因是为了组织。我真的不想要一个多千行长的 python 文件。我想将蓝图拆分成各自的文件。据我所知,不可能在 python 中的多个文件中传播一个类定义。我意识到我可以创建一系列“扩展”类,但这似乎有点黑客。 (2认同)

sso*_*ler 6

使用Flask 配置系统( app.config) 来存储所有配置数据,然后使用. 从您的蓝图中读取您的应用程序上下文current_app

存储在app.config

app.config[DATABASE_URI] = databaseURI
Run Code Online (Sandbox Code Playgroud)

读取应用程序上下文:

databaseURI = current_app.config[DATABASE_URI]
Run Code Online (Sandbox Code Playgroud)

示例代码

主要.py

from flask import Flask
from blueprint import myblueprint

app = Flask(__name__)
app.register_blueprint(myblueprint)
app.config[DATABASE_URI] = databaseURI
Run Code Online (Sandbox Code Playgroud)

蓝图.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)
Run Code Online (Sandbox Code Playgroud)