2014-01-06 55 views
0

我正在嘗試使用spyne構建REST Web服務。到目前爲止,我已經能夠使用ComplexModel來表示我的資源。一些非常基本的,像這樣(從例子中借來的):如何使用spyne構建REST層次結構

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() 

要運行我用捲曲-v「http://example.com:8000/get_meta」和我得到了我的期望。

但是如果我想訪問一些像http://example.com:8000/resourceA/get_meta這樣的資源層次呢?

謝謝你的時間!

回答

0

兩種選擇:靜態和動態。這是靜態的:

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匹配。例如

HttpPattern("/<resource>/get_meta", verb='GET') 

HttpPattern("/<resource>/get_meta", verb='(PUT|PATCH)') 

請勿使用主機匹配,爲2.10,這是壞了。

此外,由於Spyne的這一點被標記爲實驗性的,所以它的api可以隨時改變。

我希望這可以幫助

+0

我將如何去訪問集合?我需要/ /並將其與來自類的方法匹配,並且能夠接收resource_id並從那裏開始工作......但如何使用裝飾器來完成它? – Javier

+0

明白了,不是佔位符,它是一個變量!大! – Javier