我对将swagger-codegen生成的Python服务器与现有Flask应用程序集成感兴趣。 swagger-codegen 基于 Connexion Swagger API specification 库生成Python实现。

我发现的examples似乎都希望 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应用程序,也许是这样的:
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管理的蓝图一起使用。

将Connexion Swagger定义的API集成到现有的传统Flask应用程序中的最佳方法是什么?有没有人走这条路?

最佳答案

它可以创建connexion.App,然后从connexion.App(...).app扩展Flask实例。

坚持使用Application Factory是最容易的。除了是通常有用的模式外,它还可以与生成的测试很好地集成。

一个陷阱是 Controller 似乎希望连接模型,特别是如果启用了响应验证,但是默认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

关于python - 将Swagger/OpenAPI生成的python服务器与现有Flask应用程序集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41677514/

10-12 21:58