Python Connexion — обрезка ответов

Я использую Редактор Swagger для создания сервера Python Flask, я следовал Connexion, но есть проблема:

Я определил следующий ответ в файле YAML swagger:

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. Я не могу найти способ легко получить все свойства.

Итак, мой вопрос: какое решение является лучшим?

Большое спасибо!


person Bai Bing    schedule 30.01.2017    source источник
comment
При выполнении user=db.get_user_info() есть ли способ указать список полей (например, имя, фамилия), которые вам нужны? (Я не эксперт в Python, но мне кажется, что приличный ORM должен иметь такую ​​функцию)   -  person William Cheng    schedule 30.01.2017
comment
Возможно, проблема в том, что я не знаю, какие поля нужно вернуть, если только я не использую решение 1 (жестко закодировать нужные мне поля, которые дублируются содержимым в swagger YAML) или использовать решение 2 (получить поля из сгенерированной модели, что кажется очень сложным из-за рекурсивной ссылки в полях)   -  person Bai Bing    schedule 30.01.2017


Ответы (1)


Связь не влияет на то, как вы можете делать здесь то, что хотите. Что вы можете сделать, так это получить доступ к своим определениям Swagger в своем обработчике, а затем проверить, какие поля необходимо вернуть.

О том, как отменить ссылку на объекты JSON. Вы можете увидеть здесь, как Connexion это делает .

Connexion проверит ответ ваших конечных точек, если вы установите параметр validate_responses=True в вызове метода connexion.App#add_api. Так что не волнуйтесь, если ваша схема не соответствует спецификации, Connexion выдаст исключение во время выполнения. Не забудьте написать тесты для своего кода, чтобы вы могли получить такие ошибки перед развертыванием приложения в рабочей среде.

person Rafael Carício    schedule 05.03.2017
comment
Спасибо за ваш добрый ответ. Я также понял, что мне нужно самому получить доступ к определениям Swagger. До этого я пытался не обращаться к моему определению Swagger, потому что Connexion уже сделал это, я думал, что не должен делать это дважды. Но похоже, что нет объекта для получения схемы ответа. Что касается части проверки, я также заметил, что это поможет проверить мою схему, так что эта часть крутая. В любом случае, еще раз спасибо за ваше объяснение! - person Bai Bing; 06.03.2017