2017-01-30 58 views
0

我使用Swagger Editor生成一個Python瓶服務器,我跟着Connexion文檔,但有一個問題:Python的聯接 - 響應修剪

我定義在招搖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個地方維護響應屬性(包括Swagger YAML和代碼)。

解決方案2:

模型是由招搖的代碼生成生成的,所以我必須要訪問模型,並得到了響應性能,例如,用戶模型可能這樣定義的:

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

這可能很容易,但實際上響應屬性有很多$ ref,並且$ ref內部總是有$ ref。我無法輕鬆找到所有屬性的方法。

所以我的問題是,什麼是最好的解決方案?

非常感謝!

+0

當執行'user = db.get_user_info()'時,有沒有辦法指定你需要的字段列表(例如名字,姓氏)? (我不是Python的專家,但在我看來一個體面的ORM應該有這樣的功能) –

+0

這是可能的,問題是,我不知道什麼領域需要返回,除非我使用解決方案1(硬編碼字段I需要與YAGL中的內容重複),或者使用解決方案2(從生成的模型中獲取字段,由於域中的遞歸引用,這看起來非常困難) –

回答

0

Connexion不影響你如何做到你想要做的。你可以做的是在你的處理程序中訪問你的Swagger定義,然後檢查哪些字段需要返回。

關於如何取消JSON對象。你可以看到here how Connexion does that

如果您在connexion.App#add_api方法調用中設置參數validate_responses=True,Connexion將驗證您的端點的響應。所以如果你的模式不符合規範,不要擔心,Connexion會在運行時拋出一個異常。請記住爲您的代碼編寫測試,這樣在將應用程序部署到生產環境之前,您會遇到這種錯誤。

+0

感謝您的回覆。我也意識到我必須自己訪問Swagger定義。在此之前,我試圖不訪問我的Swagger定義,因爲Connexion已經完成了它,我認爲我不應該這樣做兩次。但看起來沒有提供對象來獲取響應模式。對於驗證部分,我也注意到它將有助於驗證我的模式,所以這部分很酷。無論如何,再次感謝您的解釋! –