2009-03-22 8 views
0

私は少しのチュートリアルの後でDjangoを使って少し "Hello World" Webサービスを作ろうとしていますが、何度も何度も同じ障壁を繰り返しています。Django soaplibエラー

view.py:

from soaplib_handler import DjangoSoapApp, soapmethod, soap_types 

class HelloWorldService(DjangoSoapApp): 

    __tns__ = 'http://saers.dk/soap/' 

    @soapmethod(_returns=soap_types.Array(soap_types.String)) 
    def hello(self): 
     return "Hello World" 

soaplib_handler.py:私はview.pyとsoaplib_handler.py定義した

from soaplib.wsgi_soap import SimpleWSGISoapApp 
from soaplib.service import soapmethod 
from soaplib.serializers import primitive as soap_types 

from django.http import HttpResponse 


class DjangoSoapApp(SimpleWSGISoapApp): 

    def __call__(self, request): 
     django_response = HttpResponse() 
     def start_response(status, headers): 
      status, reason = status.split(' ', 1) 
      django_response.status_code = int(status) 
      for header, value in headers: 
       django_response[header] = value 
     response = super(SimpleWSGISoapApp, self).__call__(request.META, start_response) 
     django_response.content = "\n".join(response) 

     return django_response 

をそして、それは、「レスポンス=スーパーのようです... "行は私にトラブルを与えている。私は/hello_world/services.wsdl url.pyにマッピングされたアップロードすると私が取得:

はAttributeError /hello_world/service.wsdl 「モジュール」オブジェクトは、完全なエラーメッセージには属性「のtoString」

を持っていませんでここをクリックしてください: http://saers.dk:8000/hello_world/service.wsdl

なぜこのエラーが発生するのですか? ElementTreeはどこで定義されていますか?

答えて

1

は、あなたの例の作品

soap_app_response = super(DjangoSoapApp, self).__call__(environ, start_response) 

のようになります。

0

これはあなたの問題を解決するかどうかわからが、あなたの関数ハローのデコレータは、文字列配列を返すことが想定されていますが、実際には文字列

試し_returns = soap_types.String代わり

に戻ってきていると言うではありません

レイ

+0

はい、あなたは正しいです。 http://saers.dk:8000/hello_world/service.wsdlを呼び出すと、彼はhello()メソッドを呼び出さないので、別の問題があります。 – zinovii

0

私のサービスからのコピー/貼り付け:

# SoapLib Django workaround: http://www.djangosnippets.org/snippets/979/ 
class DumbStringIO(StringIO): 
    """ Helper class for BaseWebService """ 
    def read(self, n): 
     return self.getvalue() 

class DjangoSoapApp(SimpleWSGISoapApp): 
    def __call__(self, request): 
     """ Makes Django request suitable for SOAPlib SimpleWSGISoapApp class """ 

     http_response = HttpResponse() 

     def start_response(status, headers): 
      status, reason = status.split(' ', 1) 
      http_response.status_code = int(status) 

      for header, value in headers: 
       http_response[header] = value 

     environ = request.META.copy() 
     body = ''.join(['%s=%s' % v for v in request.POST.items()]) 
     environ['CONTENT_LENGTH'] = len(body) 
     environ['wsgi.input'] = DumbStringIO(body) 
     environ['wsgi.multithread'] = False 

     soap_app_response = super(BaseSOAPWebService, self).__call__(environ, start_response) 

     http_response.content = "\n".join(soap_app_response) 

     return http_response 

ジャンゴsnippetにはバグがあります。そのURLの最後の2つのコメントを読んでください。ライン

soap_app_response = super(BaseSOAPWebService, self).__call__(environ, start_response) 

@zdmytriv