Есть ли тайм-аут в Django 1.4?

У меня проблема с Django 1.4 и Soaplib 2.0.

Когда я отправляю от моего клиента запрос с некоторыми большими аргументами, Django выдает исключение и отправляет электронное письмо такого типа: "[Django] ОШИБКА (ВНЕШНИЙ IP): Внутренняя ошибка сервера: / uri / to / soap / service"

Traceback (most recent call last):
File "/path/to/my/project/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 129, in get_response
raise ValueError("The view %s.%s didn't return an HttpResponse object." % (callback.__module__, view_name))

ValueError: The view myproject/library.soap.wsgi.view didn't return an HttpResponse object.

Я использую обычный @soap decorator, доступный по адресу http://soaplib.github.io/soaplib/2_0/pages/helloworld.html на стороне сервера.

Итак, это выглядит так на конфигурации сервера:

внутри urls.py:

from myproject.server.webservice import WebService

application_view = Application([WebService], 'ws', name='ws').as_django_view()

urlpatterns = patterns(
     url(r'^soap/.*', csrf_exempt( application_view )),
)

внутри myproject / server / webservice.py:

 from soaplib.core.service import DefinitionBase
 class WebService(DefinitionBase):
     '''
     The actual webservice class.
     This defines methods exposed to clients.
     '''
     def __init__(self, environ):
         '''
         This saves a reference to the request environment on the current instance
         '''
         self.environ = environ
         super(WebService, self).__init__(environ)

     @soap(Array(Array(String)), _returns=Integer)
     def my_method(self, params):
         return self.process(params)

     def process(self, params):
         #DO SOMETHING HERE

На стороне клиента:

 #cfg is my configuration file
 #params is a dictionary 
 client = SoapClient(
                location = cfg.location,
                action = cfg.action, # SOAPAction
                namespace = cfg.namespace, #"http://example.com/sample.wsdl",
                soap_ns= cfg.soap_ns,
                trace = cfg.trace,
                ns = cfg.ns)
 response = client.my_method(params=params)

Я попытался отправить очень большой словарь от моего клиента, и он не работает.

Я подозреваю, что Django установил таймаут и закрыл соединение во время процесса. Есть ли возможность увеличить время ожидания или проблема вызвана чем-то другим?

Кстати, я использую только Django. Я не настраивал ни Apache, ни Nginx.

1 ответ

Ваш process(self, params) Метод ничего не делает (фактически, так как в настоящее время он даже не является допустимым Python, потому что метод должен иметь хотя бы одну строку кода после сигнатуры). Там вы должны вернуть некоторые значения, которые можно использовать для создания правильного ответа мыла.

В качестве примечания я бы рекомендовал больше не использовать мыло. Он перевешивается rpclib, который теперь называется spyne. Также доступны другие библиотеки мыльного сервера, которые больше фокусируются на части SOAP (например, pysimplesoap, soapfish). Я нашел это полезным, потому что между SOAP xml и реальной реализацией обычно меньше абстракций.

Другие вопросы по тегам