2009-03-22 9 views
0

J'essaie de faire un petit service web "Hello World" avec Django après quelques tutoriels, mais je suis toujours en train de faire la même barrière. J'ai défini un view.py et soaplib_handler.py:Django soaplib error

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:

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 

Et il semble que le « réponse = super ... "line me donne des ennuis. Lorsque je charge /hello_world/services.wsdl mappée dans url.py je reçois:

AttributeError à /hello_world/service.wsdl objet « module » n'a pas d'attribut « tostring »

Pour le message d'erreur complet , voir ici: http://saers.dk:8000/hello_world/service.wsdl

Avez-vous une suggestion quant à pourquoi je reçois cette erreur? Et où est défini ElementTree?

Répondre

1

@zdmytriv La ligne

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

devrait ressembler à

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

alors votre exemple fonctionne.

0

ne sais pas si cela va résoudre votre problème, mais le décorateur sur votre fonction bonjour dit qu'il est supposé retourner un tableau de chaînes, mais vous êtes en train retourne une chaîne

Essayez _returns = soap_types.String à la place

Ray

+0

Oui, vous avez raison. En appelant http://saers.dk:8000/hello_world/service.wsdl il n'appelle pas la méthode hello(), donc il y a un problème différent. – zinovii

0

copier/coller de mon service:

# 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 

Django snippet a un bug. Lisez les deux derniers commentaires de cette URL.