AttributeError:'NoneType'对象在suds中没有属性'str'

时间:2012-03-10 06:46:30

标签: django suds

我在项目中使用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

6 个答案:

答案 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时,事情开始为我工作。