2013-07-27 31 views
0

我正在研究基於Web的系統的後端。我的代碼將接收來自我們網站的電話並執行用戶請求的操作。我們希望同時支持我們前端的多個版本。因此,例如,我可能會收到來自我們前端的V1或V2的請求。我需要回應這些電話。如何構建Python代碼以支持MY項目的多個版本(即不是多個Python版本)

正如您所預料的那樣,我的許多代碼在各個版本中都是相同的。例如,我的函數* get_list_access_params()*可能會出現在V1和V2中(儘管可能會對其中的代碼進行一些更改)。我的聽衆應該抓住請求,找出我們的系統是哪個版本的調用來的,然後調用* get_list_access_params()*的正確版本。

我希望不必將函數複製並重命名爲v1_get ...和v2_get ...,而是在兩個代碼文件(v1文件和v2文件)中複製該函數。

這一定是一種常見的需求,但我無法弄清楚在哪裏尋找答案。有沒有人有一個快速的答案,或者你可以指示我到一個簡單的地方找到它(我是一個Python新手,順便說一句)?謝謝!

回答

0

您的子流程爲網站提供了一個API。

訣竅在於使子流程代碼的API v2可以處理來自v1和v2網站的調用。這被稱爲向後兼容性。

此外,如果v1網站對接收到的數據不太挑剔,並且可以處理來自子過程的v2答案,該子過程具有比以前更多的信息。這被稱爲向前兼容性。 Json和xml是實現它的好方法,因爲您可以隨意添加屬性和屬性,而不會破壞舊屬性的解析。

所以我認爲這個解決方案並不在於python技巧,而是在仔細設計子進程的API,以便在子進程功能增加時API不會中斷。

0

首先,這是一個很直接的解決方案的非常正常的問題。 該解決方案的級別高於您的Python代碼。您可能有某種前端接觸到接收和處理請求的互聯網。其中一些請求被轉發到基於Python的後端,其他請求被拒絕,其他請求則由前端直接回應。這種前端通常也用於通過以某種「智能」方式將請求轉發給多個後端服務器來執行負載平衡。這幾天,nginx經常用於這個。如果你沒有這樣的前端,你應該部署一個。但是,從「我的代碼將接收來自我們網站的調用」我想你有一個實體在到達你的Python應用程序之前處理請求。

解決您的問題的方法是部署不同版本的基於Python的後端。爲不同的代碼版本運行不同的「服務器」。然後,由前端決定哪個請求被轉發到哪個後端,例如,簡單的URL解析。

實施例:

http://application.com/submit_data?v=1 

將由您的前端進行解析。它看到v=1,並且知道這個請求應該傳遞給在例如監聽的後端服務器。 localhost:3000

不同的請求,如

http://application.com/submit_data?v=2 

被配置爲被轉發到例如localhost:3001,一個完全獨立的Python後端實例。

+0

如果我正確地閱讀了這個問題,它是調用他的python子進程的網站代碼。 – flup

+0

是的,但是在一個代碼版本中實現不同的「代碼版本」只是很髒。一個*可以*在更高級別上分離不同的代碼版本,這是應該做的。 「我們希望同時支持我們前端的多個版本」 - 可以認爲這個子進程代碼是前端的一部分。如果他們部署不同的前端版本,則問題可以通過定義來解決。 –

0

這裏有幾個技巧 - 他們基本上對本學科的開發團隊的部分回覆:

  1. 發佈的API,並堅持下去同名的所有V2功能必須接受相同參數並在所謂的時候返回兼容的結果。
  2. 有一個通用的接口說fred,只是包裝你的V1功能
  3. 製作使用命名和默認的參數,而不是位置參數,那麼如果你的第2版代碼支持一些額外的參數,但默認設置造成的版本1的行爲你將是金色的。
  4. 使用命名空間
  5. 如果定義在fn(*arg, **agv)格式的功能,你可以在你的一般接口的包裝,如果V1和V2功能意在給定調用的作品出來。
  6. 您可以在可能不明確的所有功能中使用可選參數ifversion=1,並且在您明確需要版本2功能時使用它。

還有一種非常簡單的方法,用於V2前端連接到不同的端口或在html請求中使用特定的標誌。