我有一个 Flask 应用程序,我想在其中添加 Connexion 来验证我的 api 端点。所有 api 都捆绑在蓝图中。
我的问题是 Connexion 想要控制路由。要么通过 OpenApi 规范中的 connectionid(我发现它会将实现细节泄漏到规范中),要么通过自动路由的类系统。
我如何通过装饰器与 Connexion 一起使用正常的 Flask 路由?
以下代码失败并出现 500 内部错误。 如果我取消 OpenAPI 规范中的 operationId 注释,它就会起作用
这是cxtst.py
from flask import jsonify
from connexion import FlaskApp
app = FlaskApp(__name__)
app.add_api('cxtst.yaml')
@app.route('/test')
def test_fn():
return jsonify({'output_string': "WORKS"})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
这是cxtst.yaml
# cxtst.yaml
openapi: 3.0.3
info:
title: Demonstration of routing in Connexion
license:
name: MIT License
url: https://github.com/Buildasaurus/Factorio-Blueprint-Generator/blob/main/LICENSE
version: 0.0.1
paths:
/test:
get:
summary: Test that I have access to server
#operationId: cxtst.test_fn
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
output_string:
type: string
根据评论中的讨论,这里有一种重写上面代码的方法:
from flask import Flask, jsonify
from connexion import App
flask_app = Flask(__name__) # a normal, "standard" Flask application as you have it
# initialize Connexion
app = App(__name__, specification_dir='./') # change this if needed
app.add_api('cxtst.yaml', validate_responses=True)
@flask_app.route('/test')
def test_fn():
return jsonify({'output_string': "WORKS"})
# Merge the Flask app into Connexion's app
app.app = flask_app
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
第
app.app = flask_app
行用于将 Flask 应用程序 (flask_app
) 嵌入到 Connexion 应用程序中(在本例中为 app
)。这是必需的,因为 Connexion 是 Flask 的包装器。
当您创建 Connexion 应用程序时,它会在内部管理自己的 Flask 实例,因此要添加自定义路由(例如使用 Flask 装饰器定义的路由),您需要告诉 Connexion 使用您正在使用的 Flask 应用程序实例。
如果没有这一行,Connexion 将无法识别
@flask_app.route()
路由,因为它将在内部使用不同的 Flask 实例。有了它,您的自定义路由和 Connexion 的路由和验证将协同工作。