我在项目中使用suds客户端进行WSDL。
我有这个代码。
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)
当我运行我的程序时,我收到了这个错误:
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
我确信我的本地和测试中的代码是相同的。
我认为问题出在suds
,但我对如何解决这个问题一无所知。
有人可以帮助我吗? 提前谢谢..
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'
我真的不知道为什么我会收到这个错误。 现在我在本地和我的制作中遇到了同样的错误。 顺便说一句,当我分开代码并尝试运行。它运行正常。
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': 'development@yespayments.com.ph',
'ClientIPAddress': 'http://127.0.0.1:8000/',
'Notes': 'This is test',
}
print data
result = client.service.OnlineTransaction(**data)
print result.ResponseDescription
答案 0 :(得分:12)
这个错误在肥皂水中。 @okm很接近,但问题确实在Document.__str__
。但是,只有在使用django-debug-toolbar时才会暴露该错误,因为日志记录面板会显示已记录的所有消息。这会触发suds bug。
我已经创建了一个补丁版的suds来解决这个问题:https://github.com/bradleyayers/suds-htj
编辑:我的补丁现已合并到https://github.com/htj/suds-htj - 改为使用该存储库
答案 1 :(得分:2)
异常由self.root返回的None值引起,如suds.sax.Document中所示,
def root(self):
if len(self.children):
return self.children[0]
else:
return None
所以这似乎是因为缺少一些数据字段。重播您在测试服务器上填写的确切数据,再次在本地计算机上可能会有所帮助。还要检查测试服务器上的Django设置,以确保它们与本地设置类似。
答案 2 :(得分:2)
正如@ bradley.ayers所说,问题出在suds库(已经死了)。你可以使用他建议的分叉: https://github.com/htj/suds-htj
但是,在调试工具栏(> 0.9.4)的更高版本中,通过在相关代码周围添加try-catch语句,问题已为fixed。您可以使用:
使用调试工具栏的开发中版本 pip install django-debug-toolbar==dev
或者简单地在模块初始化文件中的某处自己修补try-catch块:
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
答案 3 :(得分:0)
我在测试服务器中遇到此问题,WSDL服务器阻止了IP地址,因此在执行此过程时,WSDL服务器会向测试服务器返回错误。
答案 4 :(得分:0)
我必须在我的设置中注释掉INTERNAL_IPS才能使此错误消失。没什么意义,但我希望这有助于其他人。 =)
答案 5 :(得分:0)
@ bradley.ayers是对的。 这个问题在suds库中。我在芹菜任务中使用suds == 0.4。
解决方法:当我将celeryd进程的日志级别从DEBUG切换回INFO时,事情开始为我工作。