Django мыльная ошибка - PullRequest
       25

Django мыльная ошибка

0 голосов
/ 22 марта 2009

Я пытаюсь сделать небольшой веб-сервис "Hello World" с Django, следуя нескольким учебникам, но я снова и снова сталкиваюсь с одним и тем же препятствием Я определил 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

И кажется, что строка "response = super ...." доставляет мне неприятности. Когда я загружаю /hello_world/services.wsdl, сопоставленный в url.py, я получаю:

AttributeError at /hello_world/service.wsdl У объекта 'module' нет атрибута 'tostring'

Полное сообщение об ошибке см. Здесь: http://saers.dk:8000/hello_world/service.wsdl

Есть ли у вас какие-либо предложения относительно того, почему я получаю эту ошибку? А где определяется ElementTree?

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

@ здмитров Линия

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

должно выглядеть как

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

тогда ваш пример работает.

0 голосов
/ 02 июля 2009

Копирование / вставка из моего сервиса:

# 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 фрагмент содержит ошибку. Прочитайте два последних комментария с этого URL.

0 голосов
/ 22 апреля 2009

не уверен, решит ли это вашу проблему, но декоратор вашей функции hello говорит, что предполагается вернуть String Array, но вы на самом деле возвращаете String

Попробуйте вместо _returns = soap_types.String

Ray

...