大家好,我们正在运行一个使用falcon-apispec库生成OpenAPI规范的Falcon应用程序。
这是初始化定义的代码:
import falcon
from apispec import APISpec
from falcon_apispec import FalconPlugin
from kubernetes import config
from api.admission_response import AdmissionResponse
from api.health import Health
from api.k8s_config_validator import K8sConfigValidator
from api.middleware.json import RequireJSON, JSONTranslator
from api.apidocs import ApiDocs
def create_app(config_validator):
api = falcon.API(middleware=[
RequireJSON(),
JSONTranslator(),
])
resources ={
'/': AdmissionResponse(config_validator),
'/api-docs': ApiDocs(),
'/health': Health()
}
for r in resources:
api.add_route(r, resources[r])
setup_swagger_documentation(api, resources)
# initialize k8s client
config.load_incluster_config()
return api
def get_app():
return create_app(K8sConfigValidator())
def setup_swagger_documentation(api, resources):
spec = APISpec(
title='Admission Controller API',
version='latest',
openapi_version='2.0',
plugins=[
FalconPlugin(api)
],
info=dict(description="Admission Controller API"),
)
for r in resources:
spec.path(resource=resources[r])
with open('./api/config/openapi/openapi_spec.yaml', 'w') as f:
f.write(spec.to_yaml())
这是我们定义的openapi-spec定义:openapi: 3.0.0
info:
description: Admission Controller API
title: Admission Controller API
version: latest
paths:
/:
post:
tags:
- "API"
parameters:
- in: "query"
name: "body"
description: "List of user object"
required: true
schema:
type: string
responses:
"200":
description: "Success"
/api-docs:
get:
tags:
- "API Doc Endpoints"
responses:
"200":
description: "Success"
/health:
get:
tags:
- "Health Endpoints"
responses:
"200":
description: "Success"
以下是定义帖子应执行的操作的类之一:class AdmissionResponse(object):
def __init__(self, k8s_config_validator):
self.k8s_config_validator = k8s_config_validator
@falcon.before(validate_schema)
def on_post(self, req, resp):
"""
---
tags: ['API']
parameters:
- in: "query"
name: "body"
description: "List of user object"
required: true
type: string
responses:
"200":
description: "Success"
"""
admission_review = AdmissionReview(req.context['doc'])
errors = self.k8s_config_validator.validate(admission_review)
if errors:
resp.context['result'] = ResponseBuilder(admission_review).not_allowed(errors)
api.logger.info("Validations for %s of kind %s in %s failed with %s", admission_review.name(), admission_review.kind(), admission_review.namespace(), errors)
else:
resp.context['result'] = ResponseBuilder(admission_review).allowed()
api.logger.info("Validations for %s of kind %s in %s passed", admission_review.name(), admission_review.kind(), admission_review.namespace())
每当我们尝试访问托管的swagger-ui时,我们都会遇到此错误:无法呈现此定义。提供的定义未指定有效的版本字段。
请指出有效的Swagger或OpenAPI版本字段。受支持的版本字段包括:“2.0”和与openapi:3.0.n匹配的字段(例如,openapi:3.0.0)。
有谁知道我们如何解决这个问题?当我们将openapi规范粘贴到位于以下位置的swagger编辑器中:https://editor.swagger.io/时,它工作正常。任何帮助都是极好的!
最佳答案
调用APISpec
时,不支持所有字符串。
尝试类似“0.0.1”(您提供了“最新”)的内容。
另外,如果openapi_version格式不正确,则使用falcon_swagger_ui可能会报告错误(在这种情况下,将提供有效格式的示例)。
这对我有用:
规格= APISpec(
title =“我的APP”,
版本=“0.0.1”,
openapi_version ='3.0.0',
plugins = [FalconPlugin(api)]
)
关于python-3.x - 猎鹰应用程序无法呈现Openapi(swagger)规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62538649/