如何在python中从api spec yaml文件检索数据?

如何在python中从api spec yaml文件检索数据?,python,yaml,Python,Yaml,我有明确定义api版本的api规范文件。我想从yaml文件访问api版本数据,并将其返回到我的一个端点。为此,我尝试读取yaml文件,但无法正确访问和获取api版本数据。也许我的代码有缺陷。有人能告诉我怎么做吗?有什么想法吗?如何以编程方式从python中的yaml文件获取和检索api版本 api规范yaml定义 以下是openapi规范场的定义: openapi: 3.0.0 info: title: test REST API description: Tes

我有明确定义api版本的api规范文件。我想从yaml文件访问api版本数据,并将其返回到我的一个端点。为此,我尝试读取yaml文件,但无法正确访问和获取api版本数据。也许我的代码有缺陷。有人能告诉我怎么做吗?有什么想法吗?如何以编程方式从python中的yaml文件获取和检索api版本

api规范yaml定义

以下是openapi规范场的定义:

openapi: 3.0.0
    info:
      title: test REST API
      description: Test REST API
      license:
        name: Apache 2.0
        url: https://www.apache.org/licenses/LICENSE-2.0.html
      version: 1.0.0
    servers:
    - url: /api/v1/
      description: test

    paths:
      /about:
        get:
          summary: api System Version
          description: Obtain current version of test api
          operationId: about_get
          responses:
            "200":
              description: About information
              content:
                application/json:
                  schema:
                    $ref: '#/components/schemas/version'
            "401":
              description: Authorization information is missing or invalid.
          x-openapi-router-controller: test_server.controllers.default_controller
      /rsession:

    components:
      schemas:
        version:
          required:
          - mayor
          - minor
          - name
          - patch
          type: object
          properties:
            name:
              type: string
            mayor:
              type: number
            minor:
              type: number
            patch:
              type: number
          description: api Version
          example:
            name: api
            mayor: 1
            minor: 0
            patch: 0
我的尝试:

更新:错误

在测试上述代码后,我发现以下错误:

AttributeError:“str”对象没有属性“pop”


这对我不起作用。有什么方法可以正确访问api spec yaml文件并在python函数中获取api版本?有什么想法吗?

首先,您的yaml结构无效。openapi:在这里可以有一个值3.0.0,也可以在下面缩进内部级别信息:在您的情况下。不是两者都有。yaml的简单json等价物是{openapi:3.0.0{info:…},这是无效的。因此,从info:及其下的后续行中删除缩进

这是修正后的yaml

openapi:3.0.0 信息: 标题:测试RESTAPI 描述:测试RESTAPI 许可证: 名称:Apache2.0 网址:https://www.apache.org/licenses/LICENSE-2.0.html 版本:1.0.0 服务器: -url:/api/v1/ 描述:测试 路径: /关于: 获取: 概要:api系统版本 描述:获取测试api的当前版本 操作ID:关于 响应: 200: 描述:关于信息 内容: 应用程序/json: 模式: $ref:“/components/schemas/version” 401: 说明:授权信息缺失或无效。 x-openapi-router-controller:test_server.controllers.default_controller /会话: 组件: 模式: 版本: 必修的: -市长 -小调 -名字 -补丁 类型:对象 特性: 姓名: 类型:字符串 市长: 类型:编号 小调: 类型:编号 补丁: 类型:编号 说明:api版本 例子: 名称:api 市长:1 小调:0 补丁:0 一旦你有了它,查看你正在寻找的版本是在info->version

所以你只需要

进口yaml spec_yaml='apispec.yaml' 使用openspec_yaml,“r”作为f: 数据=yaml.loadf 打印数据['info']['version']
首先,yaml的结构无效。openapi:在这里可以有一个值3.0.0,也可以在下面缩进内部级别信息:在您的情况下。不是两者都有。yaml的简单json等价物是{openapi:3.0.0{info:…},这是无效的。因此,从info:及其下的后续行中删除缩进

这是修正后的yaml

openapi:3.0.0 信息: 标题:测试RESTAPI 描述:测试RESTAPI 许可证: 名称:Apache2.0 网址:https://www.apache.org/licenses/LICENSE-2.0.html 版本:1.0.0 服务器: -url:/api/v1/ 描述:测试 路径: /关于: 获取: 概要:api系统版本 描述:获取测试api的当前版本 操作ID:关于 响应: 200: 描述:关于信息 内容: 应用程序/json: 模式: $ref:“/components/schemas/version” 401: 说明:授权信息缺失或无效。 x-openapi-router-controller:test_server.controllers.default_controller /会话: 组件: 模式: 版本: 必修的: -市长 -小调 -名字 -补丁 类型:对象 特性: 姓名: 类型:字符串 市长: 类型:编号 小调: 类型:编号 补丁: 类型:编号 说明:api版本 例子: 名称:api 市长:1 小调:0 补丁:0 一旦你有了它,查看你正在寻找的版本是在info->version

所以你只需要

进口yaml spec_yaml='apispec.yaml' 使用openspec_yaml,“r”作为f: 数据=yaml.loadf 打印数据['info']['version']
我认为您可以这样做,从yaml文件中获得版本:


我认为您可以这样做,从yaml文件中获得版本:

import yaml

spec_yaml= 'apispec.yaml'
with open(spec_yaml, 'r') as f:
    data = yaml.load(f)

result = {}
for elem in data['info']:
    name = elem.pop('version')
    result[name] = elem

data['apiversion'] = result

print(data['version'])
import yaml

spec_yaml= 'apispec.yaml'
with open(spec_yaml, 'r') as f:
    data = yaml.load(f)

print(data['info']['version'])