2017-01-30 4 views
0

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

я определил следующий ответ в файле чванство 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-х местах (как JAML, так и код).

Решение 2:

модель генерируется развязность CodeGen, поэтому у меня есть доступ к модели и попытаться получить свойство ответа, например, модель пользователя, вероятно, определяются следующим образом:

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

Это может быть легко, но на самом деле свойства ответа имеют много $ ref и всегда есть $ ref внутри $ ref. Я не могу найти способ легко получить все свойства.

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

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

+0

Когда вы выполняете 'user = db.get_user_info()', существует ли способ указать список полей (например, имя, фамилия), которые вам нужны? (Я не эксперт в Python, но, похоже, у меня хорошая ORM должна иметь такую ​​функцию) –

+0

Возможно, проблема в том, что я не знаю, какие поля нужно возвращать, если я не использую решение 1 (жесткий код поля I необходимость, которая дублируется с содержимым в swagger YAML) или использовать решение 2 (получить поля из сгенерированной модели, которая кажется очень сложной из-за рекурсивной ссылки в полях) –

ответ

0

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

О том, как удалить объекты JSON. Вы можете видеть here how Connexion does that.

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

+0

Спасибо за ваш добрый ответ.Я также понял, что я должен сам получить доступ к определениям Swagger. До этого я пытался не получить доступ к определению Swagger, потому что Connexion уже сделал это, я думал, что не должен делать это дважды. Но похоже, что для получения схемы ответа нет объекта. Для части проверки я также заметил, что это поможет проверить мою схему, так что часть крутая. В любом случае, еще раз спасибо за ваше объяснение! –

Смежные вопросы