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

时间:2021-09-18 08:16:16

I am using suds client for WSDL in our project.

我在我们的项目中使用suds客户端进行WSDL。

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': '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 个解决方案

#1


2  

The Exception is caued by the None value returned by self.root, as following in suds.sax.Document,

Self.root返回的None值表示异常,如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.

所以它似乎是由缺少一些数据字段引起的。重新显示您在测试服务器上填写的确切数据,在本地计算机上可能会有所帮助。还要检查测试服务器上的Django设置,以确保它们与本地设置类似。

#2


12  

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.

这个错误在肥皂水中。 @okm很接近,但问题实际上是Document .__ str__。但是,只有在使用django-debug-toolbar时才会暴露该错误,因为日志记录面板会显示已记录的所有消息。这会触发suds bug。

I've created a patched version of suds that fixes this problem: https://github.com/bradleyayers/suds-htj

我已经创建了一个补丁版的suds来解决这个问题:https://github.com/bradleyayers/suds-htj

Edit: My patch has now been merged into https://github.com/htj/suds-htj – use that repository instead

编辑:我的补丁现已合并到https://github.com/htj/suds-htj - 使用该存储库代替

#3


2  

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

正如@ bradley.ayers所说,问题出在suds库(已经死了)。您可以使用他建议的分支: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:

但是,通过在相关代码周围添加try-catch语句,已在更高版本的调试工具栏(> 0.9.4)中修复了该问题。您可以使用调试工具栏的开发版本:

   pip install django-debug-toolbar==dev

or or simply monkey-patch the try-catch block yourself somewhere in your module init files:

或者简单地在模块初始化文件中的某处自己修补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

#4


0  

I got this problem in our test server, the IP address is blocked by the WSDL server so when doing the process the WSDL server return an error to the test server.

我在测试服务器中遇到此问题,IP地址被WSDL服务器阻止,因此在执行该过程时,WSDL服务器会向测试服务器返回错误。

#5


0  

I had to comment out the INTERNAL_IPS in my settings to make this bug disappear. Makes very little sense, but I hope this helps somebody else. =)

我必须在我的设置中注释掉INTERNAL_IPS才能使这个bug消失。没什么意义,但我希望这有助于其他人。 =)

#6


0  

@bradley.ayers is right. This issue is in suds library. I'm using suds==0.4 in my celery task.

@ bradley.ayers是对的。这个问题在suds库中。我在芹菜任务中使用suds == 0.4。

workaround : Things started working for me when I switched the celeryd process' log level back to INFO from DEBUG.

解决方法:当我将celeryd进程的日志级别从DEBUG切换回INFO时,事情开始为我工作。

#1


2  

The Exception is caued by the None value returned by self.root, as following in suds.sax.Document,

Self.root返回的None值表示异常,如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.

所以它似乎是由缺少一些数据字段引起的。重新显示您在测试服务器上填写的确切数据,在本地计算机上可能会有所帮助。还要检查测试服务器上的Django设置,以确保它们与本地设置类似。

#2


12  

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.

这个错误在肥皂水中。 @okm很接近,但问题实际上是Document .__ str__。但是,只有在使用django-debug-toolbar时才会暴露该错误,因为日志记录面板会显示已记录的所有消息。这会触发suds bug。

I've created a patched version of suds that fixes this problem: https://github.com/bradleyayers/suds-htj

我已经创建了一个补丁版的suds来解决这个问题:https://github.com/bradleyayers/suds-htj

Edit: My patch has now been merged into https://github.com/htj/suds-htj – use that repository instead

编辑:我的补丁现已合并到https://github.com/htj/suds-htj - 使用该存储库代替

#3


2  

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

正如@ bradley.ayers所说,问题出在suds库(已经死了)。您可以使用他建议的分支: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:

但是,通过在相关代码周围添加try-catch语句,已在更高版本的调试工具栏(> 0.9.4)中修复了该问题。您可以使用调试工具栏的开发版本:

   pip install django-debug-toolbar==dev

or or simply monkey-patch the try-catch block yourself somewhere in your module init files:

或者简单地在模块初始化文件中的某处自己修补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

#4


0  

I got this problem in our test server, the IP address is blocked by the WSDL server so when doing the process the WSDL server return an error to the test server.

我在测试服务器中遇到此问题,IP地址被WSDL服务器阻止,因此在执行该过程时,WSDL服务器会向测试服务器返回错误。

#5


0  

I had to comment out the INTERNAL_IPS in my settings to make this bug disappear. Makes very little sense, but I hope this helps somebody else. =)

我必须在我的设置中注释掉INTERNAL_IPS才能使这个bug消失。没什么意义,但我希望这有助于其他人。 =)

#6


0  

@bradley.ayers is right. This issue is in suds library. I'm using suds==0.4 in my celery task.

@ bradley.ayers是对的。这个问题在suds库中。我在芹菜任务中使用suds == 0.4。

workaround : Things started working for me when I switched the celeryd process' log level back to INFO from DEBUG.

解决方法:当我将celeryd进程的日志级别从DEBUG切换回INFO时,事情开始为我工作。