خطأ جانغو soaplib
-
21-08-2019 - |
سؤال
وأنا أحاول أن تجعل قليلا خدمة ويب "مرحبا العالم" مع جانغو بعد قليل من الدروس، ولكن أنا ضرب نفس الحاجز مرارا وتكرارا. لقد تعريف view.py وsoaplib_handler.py:
و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
ويبدو أن "استجابة فائقة = ...." الخط هو إعطائي المتاعب. عندما تصل حمولة /hello_world/services.wsdl المعينة في url.py أحصل على:
وAttributeError في /hello_world/service.wsdl "الوحدة" كائن ليس له السمة 'tostring'
لرسالة الخطأ الكاملة، انظر هنا: http://saers.dk:8000/hello_world/service.wsdl
هل لديكم أي اقتراح لماذا أحصل على هذا الخطأ؟ وحيث ElementTree محددة؟
المحلول
وzdmytriv خط
soap_app_response = super(BaseSOAPWebService, self).__call__(environ, start_response)
ويجب أن تبدو
soap_app_response = super(DjangoSoapApp, self).__call__(environ, start_response)
وبعد ذلك المثال الخاص بك يعمل.
نصائح أخرى
ولست متأكدا إذا كان هذا سوف يحل مشكلتك، ولكن الديكور على وظيفة مرحبا بك يقول الذي يفترض أن يعود صفيف سلسلة، ولكن كنت في الواقع تعود سلسلة
وحاول _returns = soap_types.String بدلا
وراي
ونسخ / لصق من خدمة بلدي:
# 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
المتكررة لديه علة. قراءة تعليقات الماضيين من أن عنوان الموقع.