1

我正在使用Swagger Editor生成 Python Flask 服务器,我遵循了Connexion文档,但出现了问题:

我在 swagger YAML 文件中定义了以下响应:

responses:
  '200':
    description: successful operation
    schema:
      type: object
      required:
        - firstname
        - lastname
      properties:
        firstname:
          type: string
        lastname:
          type: string

我期望的是返回以下响应:

{
  "firstname": "Jane",
  "lastname" : "Doe"
}

但是,数据库 API 返回一个更大的数据集,例如:

user=db.get_user_info()
pprint.pprint(user)

{
  "firstname" : "Jane",
  "middlename": "foo",
  "lastname"  : "Doe",
  "age"       : "25",
  "sex"       : "male",
  ...
}

为了返回我期望的响应,我有 2 个解决方案,但它们都不是完美的:

解决方案1:

手动定义一个较小的数据集,例如:

user_response = {
  "firstname" = user["firstname"],
  "lastname"  = user["lastname"]
}

return user_responose

但很明显,对于每个响应,我都必须硬编码一个变量_response,这意味着我必须在 2 个位置(大张旗鼓的 YAML 和代码)维护响应属性。

解决方案2:

模型是由 swagger codegen 生成的,所以我必须访问模型并尝试获取响应属性,例如,用户模型可能定义如下:

self.swagger_types = {
  'firstname': str,
  'lastname': str,
}

这可能很容易,但实际上响应属性有很多 $ref 并且 $ref 中总是有 $ref。我找不到轻松获得所有属性的方法。

所以我的问题是,最好的解决方案是什么?

非常感谢!

4

1 回答 1

1

Connexion 不会影响您如何在这里做您想做的事。您可以做的是访问处理程序中的 Swagger 定义,然后检查需要返回哪些字段。

关于如何取消引用 JSON 对象。您可以在这里看到 Connexion 是如何做到这一点的

validate_responses=True如果您在connexion.App#add_api方法调用中设置参数,Connexion 将验证您的端点的响应。因此,如果您的架构与规范不匹配,请不要担心,Connexion 会在运行时抛出异常。请记住为您的代码编写测试,因此在将应用程序部署到生产环境之前您会遇到此类错误。

于 2017-03-05T14:42:01.050 回答