2014-10-02 2 views
0

У меня проблема с Django 1.4 и с Soaplib 2.0.Есть ли тайм-аут, установленный в Django 1.4?

Когда я отправляю от своего клиента запрос с некоторыми большими аргументами, Django создал исключение и отправил электронное письмо этого типа: «[Django] ERROR (EXTERNAL IP): Внутренняя ошибка сервера:/uri/to/soap/услуга "

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 декоратора доступный в http://soaplib.github.io/soaplib/2_0/pages/helloworld.html#declaring-a-soaplib-service на стороне сервера.

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

внутри 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/сервер/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.

+0

Это, похоже, не имеет никакого отношения к таймаутам. Вы должны показать код для этого представления. –

+0

Благодарим вас за отзыв. Я добавил дополнительную информацию, чтобы помочь вам понять мою проблему. – user3843970

ответ

0

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

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

+0

Привет, Феликс, благодарю вас за отзыв. Я посмотрю на эти другие библиотеки и посмотрю, что с ними делать. – user3843970