Web Services Made Easy (WSME)“通过提供简单而强大的键入功能来简化REST Web服务的编写,而无需直接操纵请求和响应对象”。 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的了解不足,这引起了我的疑虑。人们怎么看?这真的是一个问题,还是我缺少什么?
最佳答案
WSME根据您定义的类创建实例。例如,当接收到JSON响应时,expected datatype is called:
obj = datatype()
这将创建一个新实例。
这些实例具有自己的属性; class属性永远不会改变,因此每个
Person
实例的值永远不会在请求之间共享。这里没有线程之间共享数据的威胁。
在技术层面上,
wsattr()
对象实现data descriptor protocol;就像内置的 property
type一样,每当检索或分配或删除属性时,它们就会绑定(bind)到实例,从而决定了在这些情况下应该发生的情况。如果您想了解更多有关该过程的信息,也许我在property
类型上的帖子可以为您提供帮助:How does the @property decorator work?