Django soaplib Fehler
-
21-08-2019 - |
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?
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.