【问题标题】:Python Connexion - Response TrimmingPython Connexion - 响应修剪
【发布时间】:2017-01-30 06:18:20
【问题描述】:

我正在使用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,这意味着我必须在两个地方维护响应属性(大张旗鼓的 YAML 和代码)。

解决方案 2:

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

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

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

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

非常感谢!

【问题讨论】:

  • user=db.get_user_info() 时,有没有办法指定您需要的字段列表(例如名字、姓氏)? (我不是 Python 方面的专家,但在我看来,一个像样的 ORM 应该有这样的功能)
  • 有可能,问题是,我不知道需要返回哪些字段,除非我使用解决方案1(硬编码我需要的字段,与swagger YAML中的内容重复),或使用解决方案2(从生成的模型中获取字段,由于字段中的递归引用,这似乎非常困难)

标签: python flask swagger swagger-codegen connexion


【解决方案1】:

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

关于如何取消引用 JSON 对象。你可以看到here how Connexion does that

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

【讨论】:

  • 感谢您的友好回复。我也意识到我必须自己访问 Swagger 定义。在此之前,我试图不访问我的 Swagger 定义,因为 Connexion 已经完成了它,我认为我不应该这样做两次。但看起来没有提供任何对象来获取响应模式。对于验证部分,我还注意到它有助于验证我的模式,所以这部分很酷。无论如何,再次感谢您的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多