2014-12-10 121 views
1

Web Services Made Easy (WSME)「通過提供簡單而強大的輸入,消除了直接操作請求和響應對象的需要,從而簡化了REST Web服務的編寫」。 WSME允許您使用python類來描述服務公開的資源。 WSME似乎需要你這樣做使用像類變量:python WSME和線程安全

class Person(wsme.types.Base): 
    lastname = wsme.type.wsattr(unicode) 
    firstname = wsme.type.wsattr(unicode) 

這樣做,這樣允許WSME使用類對象作爲編組和類的解組實例的模板。然後,您在WSME裝飾的代碼中使用此類的實例,並且WSME執行解組和編組(分別)請求和響應主體的工作。

但是我對使用WSME以這種方式構建的任何服務的線程安全性有一些擔憂。如果一個服務或多或少地同時接收到兩個不同「人」資源的GET請求,那麼在我看來,服務於這些請求的線程有覆蓋彼此的「姓」,「名」等屬性的風險。即使代碼被正確編寫以使用Person類的單獨本地實例,這些屬性在類級別定義的事實意味着它們由該類的所有實例共享。

我希望我的WSME或python的理解中有些東西缺乏,這會導致我不再擔心。人們認爲什麼?這真的是一個問題,還是有我缺少的東西?

回答

1

WSME根據您定義的類創建實例。例如,在接收的JSON響應的情況下,expected datatype is called

obj = datatype() 

這將創建一個新的實例。

這些實例有自己的;類屬性永遠不會被更改,因此每個請求之間不會共享每個實例的值。

這裏的線程之間沒有共享數據的威脅。

在技術層面上,wsattr()對象實現了data descriptor protocol;就像內置的property type一樣,只要屬性被檢索或分配或刪除,就會將它們綁定到實例上,讓它決定在這些情況下應該發生什麼。如果你想了解更多關於這個過程的信息,或許我的property類型的帖子可以幫助:How does the @property decorator work?