I am using suds client for WSDL in our project.
i have this code .
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)
when i run my program i got this error:
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
I am sure that my code in my local and test are same.
I think the problem is in the suds
, but i don't have any idea on how to solve it.
Do anyone can help me in my case? thanks in advance ..
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 don't know why i got this error. Now I got the same error in my local and my production. btw, when i separate the code and try to run. it runs ok.
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
The bug is in suds. @okm was close, but the problem is really in Document.__str__
. However the bug is only exposed when using django-debug-toolbar, as the logging panel shows all the messages that have been logged. This triggers the suds bug.
I've created a patched version of suds that fixes this problem: https://github.com/bradleyayers/suds-htj
Edit: My patch has now been merged into https://github.com/htj/suds-htj – use that repository instead
As @bradley.ayers says, the problem is in suds library (which is dead). You can use the fork he suggests: https://github.com/htj/suds-htj
However, the issue has been fixed in later versions of Debug Toolbar (> 0.9.4) by adding a try-catch statement around the related code. You can use the in-development version of the Debug Toolbar using:
pip install django-debug-toolbar==dev
or or simply monkey-patch the try-catch block yourself somewhere in your module init files:
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
The Exception is caued by the None value returned by self.root, as following in suds.sax.Document,
def root(self):
if len(self.children):
return self.children[0]
else:
return None
So it seems caused by lacking some data fields. Replay the exact data which you fill on the test server, on local machine again might help. Also check Django settings on the test server to make sure they are similar as your local settings.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With