带有蓝图的API版本控制会导致冲突



现在我需要为我的api发布一个新版本,并且仍然支持以前的版本。

我遵循了这个问题公认答案中给出的指示。不幸的是,我没有足够的代表在评论中询问答案。

我有一个看起来像这样的应用程序结构:

+-- app/
    +-- api_2_0/
        +-- __init__.py
        (...)
    +-- api_2_1/
        +-- __init__.py
        (...)
   +-- __init__.py

两者都是蓝图,我在create_app方法中的__init__.py中以这种方式初始化(我使用的是应用程序工厂方法):

def create_app(config_name):
    app = Flask(__name__)
    (...)
    from .api_2_0 import api as api_2_0_blueprint
    app.register_blueprint(api_2_0_blueprint, url_prefix='/api/v2.0')
    from .api_2_1 import api as api_2_1_blueprint
    app.register_blueprint(api_2_1_blueprint, url_prefix='/api/v2.1')

但这导致:

AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x7f8e48e82c10> and <flask.blueprints.Blueprint object at 0x7f8e48ef7150>.  Both share the same name "api".  Blueprints that are created on the fly need unique names.

的确,两者在文件夹中都被称为api,但我用不同的名称导入它们。对于每个版本,必须将所有对api的调用重命名为其他内容,这将使版本控制变得困难,并且总体上会造成代码混乱。

有更好的方法吗?

好的,所以我只需要更改蓝图定义。

之前,我将两个蓝图都定义为api = Blueprint('api', __name__),这导致了冲突,并使我认为我需要更改变量api的名称。

事实证明,我真正需要更改的只是对Blueprint的调用中使用的字符串'api',所以现在我的蓝图被定义为api = Blueprint('api_2_0', __name__)api = Blueprint('api_2_1', __name__),这使我可以在这两种情况下保持变量api相同,并省去了在任何地方都更改它的问题。

我现在意识到这是一个非常愚蠢的问题,但我将把这个留在这里,以防有人遇到同样的问题。

最新更新