将由Swagger/OpenAPI生成的Python服务器与现有的Flask应用程序集成。

10

我希望将由 swagger-codegen 生成的Python服务器与现有的Flask应用程序整合。 swagger-codegen 根据Swagger API规范生成基于Connexion库的Python实现。

我发现的示例似乎都期望connexion.App管理整个flask应用程序。

import connexion

app = connexion.App(__name__, specification_dir='swagger/')
app.add_api('my_api.yaml')
app.run(port=8080)

然而,我有现有的蓝图、配置和SQLAlchemy模型,我想将它们与生成的Connexion API集成。看起来 connexion.App.app 是基础的Flask应用程序。一种选择可能是深入其中并扩展Connexion Flask应用程序,可能像这样:

然而,我有现有的蓝图、配置和SQLAlchemy模型,我希望将它们与生成的Connexion API集成。看起来 connexion.App.app 是底层的Flask应用程序。一个选项是直接扩展Connexion Flask应用程序,就像这样:

import connexion

app = connexion.App(__name__, specification_dir='swagger/')

app.app.config.from_pyfile('...')
db.init_app(app.app)
for blueprint in my_blueprints:
    app.app.register_blueprint(blueprint)

app.add_api('my_api.yaml')

app.run(port=8080)

尝试在强化定制的Connexion Flask应用中获取便利似乎比将裸蓝图从connexion.Api集成到我的现有Flask应用程序中更为简单。然而,我无法轻易地确定Connexion是否设计得能够与非Connexion管理的蓝图友好地协作。

如何最佳地在现有传统Flask应用程序中集成Connexion定义的Swagger API?是否有人走过这条路?

1个回答

8

创建 connexion.App 并从其中扩展 Flask 实例是有效的。

最好坚持使用 应用程序工厂。除了通用的有用模式外,它还可以很好地与生成的测试集成。

需要注意的一点是,连接模型似乎是从控制器中期望的,特别是如果启用响应验证,则不会由默认的JSON序列化程序处理。该模型带有一个 JSONEncoder 类,可帮助进行模型序列化,但需要在 create_app 中连接它。

def create_app():
    connexionApp = connexion.App(__name__, specification_dir='swagger')
    app = connexionApp.app

    # This allows the connexion models to be serialized to JSON    
    app.json_encoder = JSONEncoder

    # normal configuration

    # The return value is a `connexion.Api`.
    # If needed, the api blueprint is available at `connexion.Api.blueprint`
    connexionApp.add_api('swagger.yaml')

    return app

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接