Frage

Ich versuche, ein wenig „Hallo Welt“ Webservice mit Django nach ein paar Übungen zu machen, aber ich bin die gleiche Barriere immer und immer wieder zu schlagen. Ich habe eine view.py und soaplib_handler.py definiert:

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

Und es scheint, die „response = Super ....“ Linie gibt mir Mühe. Als ich oben /hello_world/services.wsdl in url.py abgebildet laden erhalte ich:

Attribute bei /hello_world/service.wsdl ‚Modul‘ Objekt hat kein Attribut ‚tostring‘

Für die vollständige Fehlermeldung finden Sie hier: http://saers.dk:8000/hello_world/service.wsdl

Haben Sie Vorschläge, warum ich diesen Fehler? Und wo ist ElementTree definiert?

War es hilfreich?

Lösung

@zdmytriv die Zeile

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

sollte so aussehen

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

dann Ihr Beispiel funktioniert.

Andere Tipps

nicht sicher, ob dies Ihr Problem lösen, aber der Dekorateur auf Ihrer Funktion hallo sagt, dass es ein String-Array zurück annehmen wird, aber Sie sind ein String tatsächlich Rückkehr

Versuchen _returns = soap_types.String statt

Ray

Kopieren / Einfügen von meinem Dienst:

# 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

Schnipsel hat einen Bug. Lesen Sie die letzten zwei Kommentare von dieser URL.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top