当前位置: 首页 > 知识库问答 >
问题:

Falcon应用程序无法呈现Openapi(swagger)规范

魏刚豪
2023-03-14

大家好,我们正在运行一个使用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: 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())

共有1个答案

马梓
2023-03-14

调用apispec时,并不支持所有字符串。尝试“0.0.1”(您提供了“最新的”)。另外,使用falcon_swagger_ui,如果openapi_version格式不正确,可能会报告错误(在这种情况下,提供了有效格式的示例)。

这对我很有效:

 spec = APISpec(
        title="My APP",
        version="0.0.1",
        openapi_version='3.0.0',
        plugins=[FalconPlugin(api)]
    )
 类似资料:
  • 我正在使用OpenApi和Swagger构建一些文档,但由于js错误,我无法对其进行测试。 我想定义一个将接受特定值的参数,因此我在属性中添加了。我在请求中定义参数,如下所示 开发工具

  • 我得到一个错误--“请指出一个有效的Swagger或OpenAPI版本字段。支持的版本字段是Swagger:”2.0“和那些与OpenAPI:3.0.n匹配的版本字段(例如,OpenAPI:3.0.0)。”当我将生成的json从/api-docs粘贴到editor.swagger.io时。我有一些观察。 > localhost:8080/v3/api-docs/yields-此json在edito

  • 我已经创建了一个Azure API应用程序,并将其部署到Azure。起初,我从门户获取Swagger文件没有问题(例如,通过单击API App blade上的“API定义”按钮),但在某个时候,它停止了工作。 我已经在中启用了Swagger用户界面。当我在本地调试时,我可以导航到http://localhost:12345/Swagger要进入Swagger UI并下载Swagger文件,一切正常

  • 我有一个使用嵌入式tomcat服务器运行的spring引导应用程序。我在将springfox-swagger与应用程序集成方面取得了部分成功。如果我执行/v2/api-docs,我就能够在WebApp中看到所有API的所有文档。但是,当我试图从UI访问相同的内容时,它不起作用。以下是详细的结果。 -localhost:8080/api/swagger-resources的输出 下面是我正在使用的s

  • 我使用和。我有一个带有方法的控制器,其中包含作为url参数的数组: 为什么会发生这种情况?为什么项目中没有显示示例数组?

  • 请注意,我在我的项目中添加了swagger-ui.html,因为它已经为Swagger2.0添加了 请帮助获得swagger主屏幕,以便我可以测试rest服务