【问题标题】:From Spyne to Suds从 Spyne 到 Suds
【发布时间】:2013-08-02 19:56:29
【问题描述】:

我正在尝试使用 Spyne 和 Suds 的组合(尽管我对使用 Suds 不是很特别)来创建一个模块,该模块充当两个 SOAP 实体之间的中间人。

有一个客户端C,它连接到服务器S,调用一个方法M,返回一个ComplexType,D。同样的数据对象需要S发送到另一个服务器S1。当然,在服务器 S1 上有一个方法 M1,它以 D 类型作为参数。我面临的问题是我不能只将 D 发送到 S1,而不转换为 Suds 识别的类型。

有没有一种聪明的方法来做到这一点,而无需逐个字段地将 D 的属性从一种“类型”复制到另一种?

【问题讨论】:

    标签: python soap suds spyne


    【解决方案1】:

    您确实可以将传入的对象转换为 dicts 并将它们传递给 suds。但是 Spyne 已经提供了两种方式对象dict 转换工具。

    要转换为 dict,您可以使用 spyne.util.dictdoc

    例如

    from spyne.model.complex import ComplexModel
    from spyne.model.primitive import Integer
    
    class B(ComplexModel):
        c = Integer
    
    class A(ComplexModel):
        a = Integer
        b = B 
    
    from spyne.util.dictdoc import get_object_as_dict
    print get_object_as_dict(A(a=4, b=B(c=5)), A)
    # prints {'a': 4, 'b': {'c': 5}}
    
    get_object_as_dict(A(a=4, b=B(c=5)), A, ignore_wrappers=False)
    # prints {'A': {'a': 4, 'b': {'B': {'c': 5}}}}
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      您可以将 D 类型的对象转换为字典并将字典传递给服务方法,Suds 采用尊重对象结构的字典:https://fedorahosted.org/suds/wiki/Documentation#ComplexArgumentsUsingPythondict

      要转换为 dict,您可以使用此处的代码:Recursively convert python object graph to dictionary

      即:

          D_inst = S.service.M()
          D_dict = to_dict(D_inst)
          S1.service.M1(D_dict)
      

      【讨论】:

        【解决方案3】:

        Suds 在解析复杂对象时存在很大问题。

        例如

        class C(ComplexModel):
            d = Integer
        
        class B(ComplexModel):
            c = Array(C)
        
        class A(ComplexModel):
            a = Integer
            b = B 
        

        在这种情况下,使用get_object_to_dict 正确转换为字典函数,但 suds 无法调用 SOAP 方法并以Type not found 'c' 失败。

        【讨论】:

          猜你喜欢
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多