【问题标题】:API versioning with blueprints causes colission带有蓝图的 API 版本控制会导致冲突
【发布时间】:2016-07-28 05:00:22
【问题描述】:

我需要为我的 api 发布一个新版本并仍然支持以前的版本的时候到了。

我按照this question 的已接受答案中给出的说明进行操作。不幸的是,我没有足够的代表在该答案的 cmets 中提问。

我的应用结构如下所示:

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

两者都是我在__init__.py 中的create_app 方法中以这种方式初始化的蓝图(我正在使用app factory 方法):

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 的调用重命名为其他名称,这会使版本控制变得痛苦,并且总体上会造成代码混乱。

有没有更好的方法来做到这一点?

【问题讨论】:

标签: python flask versioning


【解决方案1】:

好吧,事实证明我只需要更改蓝图定义。

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

原来我真正需要更改的只是调用Blueprint时使用的字符串'api',所以现在我的蓝图定义为api = Blueprint('api_2_0', __name__)api = Blueprint('api_2_1', __name__),允许我保留变量@987654327 @ 在这两种情况下都一样,并且为我省去了到处找它的问题。

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

【讨论】:

  • 我相信,每次您可以使用__name__ 来处理这两个参数时,都可以避免弄乱那个特定的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2011-03-31
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2012-05-12
相关资源
最近更新 更多