2012-03-10 21 views
5

Estoy utilizando el cliente de espuma para WSDL en nuestro proyecto.AttributeError: el objeto 'NoneType' no tiene atributo 'str' en suds

tengo este código.

sudsclient = sudsClient(settings.WSDL_URL) 
values = { 
            "MerchantCode": settings.YP_MERCHANT_CODE, 
            "MerchantReference": str(reference_id), 
            "TransactionType":settings.YP_TRANSACTION_TYPE, 
            "Amount":int(charged), 
            "CurrencyCode":client.currency, 
            "CardHolderName":str(form.cleaned_data['name_on_card']), 
            "CardNumber": str(form.cleaned_data['card_number']), 
            "ExpiryMonth":int(form.cleaned_data['exp_month']), 
            "ExpiryYear":int(form.cleaned_data['exp_year']), 
            "CardID":0, 
            "CardSecurityCode":str(form.cleaned_data['security_code']), 
            "CustomerAccountNumber":"", 
            "BillNumber":0, 
            "CardHolderEmail":str(form.cleaned_data['email']), 
            "ClientIPAddress":get_ip, 
            "Notes":"OK", 
              } 
response = sudsclient.service.OnlineTransaction(**values) 

cuando ejecuto mi programa me dio este mensaje:

Exception Type: AttributeError 
Exception Value:  
'NoneType' object has no attribute 'str' 
Exception Location: /usr/local/lib/python2.7/dist-packages/suds/sax/document.py in str, line 48 

estoy seguro de que mi código en mi local y la prueba son los mismos.

Creo que el problema está en el suds, pero no tengo ni idea de cómo resolverlo.

¿Alguien puede ayudarme en mi caso? gracias de antemano ..

Environment: 

Request Method: GET 
Request URL: http://127.0.0.1:8000/1/book/save/?csrfmiddlewaretoken=05e5bdb542c3be7515b87e8160c347a0&check_in=2012-04-24&check_out=2012-04-25&no_of_nights=1&quantity=1&product=4&price=900.0&chargedMasterCard=180.0&chargedVisa=90.0&totalcostMasterCard=720.0&totalcostVisa=810.0&totalcost=900.0&charged=10.0&price_rate=1000.0&old_totalcost=1000.0&discount_charged=100.0&first_name=dsnmbmh&last_name=jhbjhb&email=jdlabandero%40agile.com.ph&contact=657879&address=gjkj&no_of_adult=1&no_of_kid=0&memo=&card_type=MasterCard&card_number=40000234234210&security_code=788&name_on_card=ghjk&exp_month=1&exp_year=2012 

Django Version: 1.3.1 
Python Version: 2.7.1 
Installed Applications: 
['admin_tools', 
'admin_tools.theming', 
'admin_tools.menu', 
'admin_tools.dashboard', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.humanize', 
'django.contrib.admin', 
'surebooked.booking', 
'surebooked.api', 
'surebooked.account_app', 
'surebooked.client_app', 
'surebooked.product_app', 
'surebooked.report_app', 
'debug_toolbar', 
'billing', 
'south', 
'paypal.standard.ipn', 
'django_extensions', 
'cms', 
'menus', 
'mptt', 
'south', 
'cms.plugins.text', 
'cms.plugins.picture', 
'cms.plugins.link', 
'cms.plugins.file', 
'cms.plugins.snippet', 
'cms.plugins.googlemap', 
'sekizai', 
'django.contrib.admin', 
'filer', 
'sorl.thumbnail', 
'easy_thumbnails', 
'cmsplugin_filer_file', 
'cmsplugin_filer_folder', 
'cmsplugin_filer_image', 
'cmsplugin_filer_teaser', 
'cmsplugin_filer_video', 
'media_tree', 
'django_cron'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.csrf.CsrfResponseMiddleware', 
'debug_toolbar.middleware.DebugToolbarMiddleware', 
'media_tree.middleware.SessionPostMiddleware', 
'cms.middleware.page.CurrentPageMiddleware', 
'cms.middleware.user.CurrentUserMiddleware', 
'cms.middleware.toolbar.ToolbarMiddleware') 


    Traceback: 
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
     111.       response = callback(request, *callback_args, **callback_kwargs) 
    File "/home/agileone/workspace/surebooked/surebooked/../surebooked/booking/views.py" in booking_save_page 
     752.        response = sudsclient.service.OnlineTransaction(**values) 
    File "/usr/local/lib/python2.7/dist-packages/suds/client.py" in __call__ 
     542.    return client.invoke(args, kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/suds/client.py" in invoke 
     595.   soapenv = binding.get_message(self.method, args, kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py" in get_message 
     120.   content = self.bodycontent(method, args, kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/document.py" in bodycontent 
     63.    p = self.mkparam(method, pd, value) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/document.py" in mkparam 
     105.    return Binding.mkparam(self, method, pdef, object) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py" in mkparam 
     287.   return marshaller.process(content) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/core.py" in process 
     62.    self.append(document, content) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/core.py" in append 
     73.   log.debug('appending parent:\n%s\ncontent:\n%s', parent, content) 
    File "/usr/lib/python2.7/logging/__init__.py" in debug 
     1120.    self._log(DEBUG, msg, args, **kwargs) 
    File "/usr/lib/python2.7/logging/__init__.py" in _log 
     1250.   self.handle(record) 
    File "/usr/lib/python2.7/logging/__init__.py" in handle 
     1260.    self.callHandlers(record) 
    File "/usr/lib/python2.7/logging/__init__.py" in callHandlers 
     1300.      hdlr.handle(record) 
    File "/usr/lib/python2.7/logging/__init__.py" in handle 
     744.     self.emit(record) 
    File "/home/agileone/workspace/surebooked/surebooked/.ve/src/django-debug-toolbar/debug_toolbar/panels/logger.py" in emit 
     51.    'message': record.getMessage(), 
    File "/usr/lib/python2.7/logging/__init__.py" in getMessage 
     328.    msg = msg % self.args 
    File "/usr/local/lib/python2.7/dist-packages/suds/sax/document.py" in __str__ 
     58.   return unicode(self).encode('utf-8') 
    File "/usr/local/lib/python2.7/dist-packages/suds/sax/document.py" in __unicode__ 
     61.   return self.str() 
    File "/usr/local/lib/python2.7/dist-packages/suds/sax/document.py" in str 
     48.   s.append(self.root().str()) 

    Exception Type: AttributeError at /1/book/save/ 
    Exception Value: 'NoneType' object has no attribute 'str' 

i really2x No sé por qué tengo este error. Ahora recibí el mismo error en mi producción local y en la mía. por cierto, cuando separa el código y trato de ejecutarlo. funciona bien

sudstest.py

#!/usr/bin/env python 
import os 
from suds.client import Client as abo 

WSDL = 'DirectConnect.production.wsdl' 

#def test_api(): 
url = 'file://' + os.path.join(os.path.abspath(os.path.dirname(__file__)), WSDL) 
print url 
client = abo(url) 

data = { 
    'MerchantCode': 'HELLO', 
    'MerchantReference': '3252', 
    'TransactionType': 20, 
    'Amount': 10, 
    'CurrencyCode': 'USD', 
    'CardHolderName': 'RAUL O REVECHE', 
    'CardNumber': 4005550000000001, 
    'ExpiryMonth': 5, 
    'ExpiryYear': 2013, 
    'CardID': 0, 
    'CardSecurityCode': 400, 
    'CustomerAccountNumber': '', 
    'BillNumber': 0, 
    'CardHolderEmail': '[email protected]', 
    'ClientIPAddress': 'http://127.0.0.1:8000/', 
    'Notes': 'This is test', 
} 

print data 
result = client.service.OnlineTransaction(**data) 
print result.ResponseDescription 
+0

completa de rastreo por favor. – jpic

+0

ahora tengo el mismo error en mi local y en la producción. – gadss

Respuesta

2

La excepción es caued por el valor devuelto por Ninguno self.root, como siguiente en suds.sax.Document,

def root(self): 
    if len(self.children): 
     return self.children[0] 
    else: 
     return None 

por lo que parece causada por la falta algunos campos de datos Vuelva a reproducir los datos exactos que llena en el servidor de prueba, en la máquina local de nuevo podría ayudar. También verifique la configuración de Django en el servidor de prueba para asegurarse de que sean similares a su configuración local.

+1

gracias por la respuesta okm ... intento verificar mi configuración pero no hay problema ... – gadss

0

Tengo este problema en nuestro servidor de prueba, la dirección IP está bloqueada por el servidor WSDL, por lo que al realizar el proceso, el servidor WSDL devuelve un error al servidor de prueba.

0

Tuve que comentar los INTERNAL_IPS en mi configuración para hacer que este error desapareciera. Tiene muy poco sentido, pero espero que esto ayude a otra persona. =)

+0

hola bahoo gracias por la respuesta, no tengo INTERNAL_IPS en mi configuración. – gadss

+0

Intenta deshabilitar tu barra de herramientas. Un tiro en la oscuridad; pero mi configuración de INTERNAL_IPS que tuve que deshabilitar fue para la barra de herramientas django-debug, así que tal vez esté relacionado. Tuve la misma situación, Python independiente funcionó bien, pero estalló dentro de mi aplicación ... espero que ayude. – bahoo

12

El error está en espuma. @okm estaba cerca, pero el problema está realmente en Document.__str__. Sin embargo, el error solo se expone al usar django-debug-toolbar, ya que el panel de registro muestra todos los mensajes que se han registrado. Esto desencadena el error de espuma.

He creado una versión parcheada de espuma que soluciona este problema: https://github.com/bradleyayers/suds-htj

Editar: Mi parche ahora se ha fusionado en https://github.com/htj/suds-htj - utilizar ese repositorio en lugar

+0

Gracias, esta corrección también fue necesaria para ejecutar suds en App Engine. ¡Aclamaciones! –

+3

Creo que el SUDS más reciente se mantiene aquí: https://bitbucket.org/jurko/suds 'pip install suds-jurko' – benjaoming

+0

@ bradley.ayers Estoy enfrentando el mismo problema con el comando de administración personalizada de Django. ¿Alguna idea? – Conans

0

@ bradley.ayers es correcto . Este problema está en la biblioteca de suds. Estoy usando espuma == 0.4 en mi tarea de apio.

solución: Las cosas comenzaron a funcionar para mí cuando cambié el nivel de registro del proceso de apilación a INFO de DEPURACIÓN.

2

Como dice @ bradley.ayers, el problema está en la biblioteca de jabonaduras (que está muerta).Puede usar el tenedor sugiere: https://github.com/htj/suds-htj

Sin embargo, el tema ha sido fixed en versiones posteriores de la barra de depuración (> 0.9.4) mediante la adición de una sentencia try-catch alrededor del código relacionado. Puede utilizar la versión en desarrollo de la barra de depuración usando:

pip install django-debug-toolbar==dev 

o o simplemente mono-parchear el try-catch bloquear a sí mismo en alguna parte de sus archivos de inicialización del módulo:

import debug_toolbar.panels.logger 

original_emit = debug_toolbar.panels.logger.ThreadTrackingHandler.emit 
def emit(self, record): 
    try: 
     original_emit(self, record) 
    except: 
     pass 
debug_toolbar.panels.logger.ThreadTrackingHandler.emit = emit 
Cuestiones relacionadas