我正在尝试使用spyne构建REST Web服务。到目前为止,我已经能够使用ComplexModel来表示我的资源。像这样的非常基本的东西(从例子中借用):
class Meta(ComplexModel):
version = Unicode
description = Unicode
class ExampleService(ServiceBase):
@srpc(_returns=Meta)
def get_meta():
m = Meta()
m.version="2.0"
m.description="Meta complex class example"
return m
application = Application([ExampleService],
tns='sur.factory.webservices',
in_protocol=HttpRpc(validator='soft'),
out_protocol=JsonDocument()
)
if __name__ == '__main__':
wsgi_app = WsgiApplication(application)
server = make_server('0.0.0.0', 8000, wsgi_app)
server.serve_forever()
要运行我使用curl -v“http://example.com:8000/get_meta”,我得到了我期望的结果。
但是,如果我想访问某些资源层次结构,例如http://example.com:8000/resourceA/get_meta ??
,该怎么办?谢谢你的时间!
答案 0 :(得分:1)
两个选项:静态和动态。这是静态的:
from spyne.util.wsgi_wrapper import WsgiMounter
app1 = Application([SomeService, ...
app2 = Application([SomeOtherService, ...
wsgi_app = WsgiMounter({
'resourceA': app1,
'resourceB': app2,
})
今天有效。请注意,您可以堆叠WsgiMounter
。
对于动态的,你应该使用HttpPattern()。我认为这仍然是实验性的,因为我不喜欢实现,但这适用于2.10.x,werkzeug,pyparsing< 2和WsgiApplication:
class ExampleService(ServiceBase):
@rpc(Unicode, _returns=Meta, _patterns=[HttpPattern("/<resource>/get_meta")])
def get_meta(ctx, resource):
m = Meta()
m.version = "2.0"
m.description="Meta complex class example with resource %s" % resource
return m
不要忘记打开验证并对resource
类型设置一些限制以防止DoS攻击并抛出TypeError
等等。我会这样做:
ResourceType = Unicode(24, min_len=3, nullable=False,
pattern="[a-zA-Z0-9]+", type_name="ResourceType")
请注意,您还可以将http谓词与HttpPattern匹配。 e.g。
HttpPattern("/<resource>/get_meta", verb='GET')
或
HttpPattern("/<resource>/get_meta", verb='(PUT|PATCH)')
不要使用主机匹配,从2.10开始,它已经坏了。
此外,由于Spyne的这一点被标记为实验性的,它的api可以随时改变。
我希望这会有所帮助