现在我需要为我的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
相同,并省去了在任何地方都更改它的问题。
我现在意识到这是一个非常愚蠢的问题,但我将把这个留在这里,以防有人遇到同样的问题。