2014-01-06 2 views
0

spyne를 사용하여 REST 웹 서비스를 작성하려고합니다. 지금까지 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() 

나는 "http://example.com:8000/get_meta을"컬 -v를 사용하고 내가 기대하는 것을 얻을 실행합니다.

그러나 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 WsgiApplication을 대한 파싱, 2.10.x, WERKZEUG와 함께 작동 :

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 

유효성 검사를 켜고 몇 가지 제한을 넣어하는 것을 잊지 마세요 DoS 공격을 막고 TypeError과 그 외 이것들을 던지는 타입의 resource. 내가 할 줄 :

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

관련 문제