2013-09-21 2 views
2

Я пытаюсь унаследовать декорированный класс, как этоткак я наследовать класс с декораторов spyne

class SOAPCategoy(ComplexModel): 
    id = Integer 
    CategoyName = Unicode 

class SOAPServiceBase(ServiceBase): 
    @rpc(Integer, _returns=SOAPSeller) 
    def Item(self, pId): 
     .... 
     return SOAPCategory() 

class SOAPCategoryService(SOAPServiceBase): 
    pass 

. 
. 
. 
wsgi_app = wsgi_soap_application([SOAPCategoryService], 'test.soap') 

Затем он выдает ошибку:

File "...spyne/interface/xml_schema/_base.py", line 186, in build_validation_schema 
f = open('%s/%s.xsd' % (tmp_dir_name, pref_tns), 'r') 
IOError: [Errno 2] No such file or directory: '/tmp/spyne9y_uw9/tns.xsd' 

Часть _base.py исходного кода

def build_validation_schema(self): 
    """Build application schema specifically for xml validation purposes.""" 

    self.build_schema_nodes(with_schema_location=True) 

    pref_tns = self.interface.get_namespace_prefix(self.interface.tns) 
    tmp_dir_name = tempfile.mkdtemp(prefix='spyne') 
    logger.debug("generating schema for targetNamespace=%r, prefix: " 
       "%r in dir %r" % (self.interface.tns, pref_tns, tmp_dir_name)) 

    # serialize nodes to files 
    for k, v in self.schema_dict.items(): 
     file_name = '%s/%s.xsd' % (tmp_dir_name, k) 
     f = open(file_name, 'wb') 
     etree.ElementTree(v).write(f, pretty_print=True) 
     f.close() 
     logger.debug("writing %r for ns %s" % (file_name, 
                self.interface.nsmap[k])) 

    f = open('%s/%s.xsd' % (tmp_dir_name, pref_tns), 'r') 

ответ

1

Spyne предназначен для предотвращения вы с помощью наследования с ServiceBase детей. Вы должны использовать композицию.

class SOAPServiceBase(ServiceBase): 
    @rpc(Integer, _returns=SOAPSeller) 
    def Item(self, pId): 
     # .... 
     return SOAPCategory() 

class SOAPCategoryService(ServiceBase): 
    # ... 

wsgi_app = wsgi_soap_application([SOAPServiceBase, SOAPCategoryService], 'test.soap') 

Если вам нужно экспортировать тот же пакет обновления из различных конечных точек, вы должны сделать это:

def TSoapServiceBase(): 
    class SOAPServiceBase(ServiceBase): 
     @rpc(Integer, _returns=SOAPSeller) 
     def Item(self, pId): 
      # .... 
      return SOAPCategory() 

    return SOAPServiceBase 

some_app = wsgi_soap_application([TSoapServiceBase()], 'test.soap') 
some_other_app = wsgi_soap_application([TSoapServiceBase()], 'test.soap') 
# etc... 
+0

ОК спасибо, я попробую ваши предложения. – ivocnii

1

Если вы хотите заменить какой-либо метод обслуживания вы можете продлить услугу и следующей копии методов из класс родительских услуг:

# Define main service class. 
class OldService(ServiceBase): 
    @srpc(Unicode, _returns=Unicode) 
    def some_method(input): 
     return u'Original!' 

# Overload service class. 
class NewService(OldService): 
    @srpc(Unicode, Unicode, Unicode, _returns=Unicode) 
    def some_method(input1, input2, input3): 
     return u'Replaced!' 

# Attach old methods. 
for base in NewService.__bases__: 
    if issubclass(base, ServiceBase): 
     for name, method in base.public_methods.iteritems(): 
      if name not in NewService.public_methods: 
       NewService.public_methods[name] = method 

Протестировано со Spyne 2.11.0. И ... это нехорошее решение.

Смежные вопросы