Атрибут «тип»: значение QName «{http://www.w3.org/2001/XMLSchema}EmailString» не разрешается в определение типа (n), строка 4.

Я хочу расширить поле Unicode spyne с помощью регулярного выражения, чтобы убедиться, что это допустимый формат электронной почты. Но даже при копировании базового примера из документации spyne http://spyne.io/docs/2.10/manual/03_types.html, я получаю указанную выше ошибку (см. заголовок) при посещении localhost/my-url-endpoint?wsdl.

Я использую Django 1.6 и Spyne 2.10.10. на Windows8 64-бит. Любое предложение, почему это не удается?

Код:

from django.views.decorators.csrf import csrf_exempt
from spyne.protocol.soap import Soap11
from spyne.interface import Wsdl11
from spyne.service import ServiceBase
from spyne.decorator import srpc, rpc
from spyne.model.primitive import Unicode, Integer, Mandatory
from spyne.model.complex import Iterable
from spyne.application import Application
from spyne.server.django import DjangoApplication

class EmailString(Unicode):
    __type_name__ = 'EmailString'

    class Attributes(Unicode.Attributes):
        max_length = 128
        pattern = '[^@]+@[^@]+'

class MyService(ServiceBase):

    @rpc(EmailString, _returns=Unicode)
    def my_function(ctx, my_email):
        return "Your email is %s" % my_email

application = Application(
        [                  
            MyService
        ],
        tns="http://tempuri.org",
        interface=Wsdl11(),
        in_protocol=Soap11(validator='lxml'),
        out_protocol=Soap11()
)
myServiceApp = csrf_exempt(DjangoApplication(application))

Затем MyServiceApp указывается в urls.py:

urlpatterns += patterns('',
    (r'^my-url-endpoint$', 'myapp.views.myServiceApp'),
)

Трассировки стека:

Internal Server Error: /en/wsCRMService
Traceback (most recent call last):
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\core\handlers\base.py", line 101, in get_response
    resolver_match = resolver.resolve(request.path_info)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\core\urlresolvers.py", line 320, in resolve
    sub_match = pattern.resolve(new_path)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\core\urlresolvers.py", line 320, in resolve
    sub_match = pattern.resolve(new_path)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\core\urlresolvers.py", line 320, in resolve
    sub_match = pattern.resolve(new_path)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\core\urlresolvers.py", line 222, in resolve
    return ResolverMatch(self.callback, args, kwargs, self.name)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\core\urlresolvers.py", line 229, in callback
    self._callback = get_callable(self._callback_str)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\utils\functional.py", line 32, in wrapper
    result = func(*args)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\core\urlresolvers.py", line 96, in get_callable
    mod = import_module(mod_name)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\django-1.6.1-py2.7.egg\django\utils\importlib.py", line 40, in import_module
    __import__(name)
  File "E:\my_project\myapp\views.py", line 146, in <module>
    out_protocol=Soap11()
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\spyne\application.py", line 104, in __init__
    self.in_protocol.set_app(self)
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\spyne\protocol\xml\_base.py", line 413, in set_app
    xml_schema.build_validation_schema()
  File "C:\Users\Anze\Virtual Environments\my_project\lib\site-packages\spyne\interface\xml_schema\_base.py", line 189, in build_validation_schema
    self.validation_schema = etree.XMLSchema(etree.parse(f))
  File "xmlschema.pxi", line 102, in lxml.etree.XMLSchema.__init__ (src\lxml\lxml.etree.c:154067)
XMLSchemaParseError: element decl. '{http://tempuri.org}my_email', attribute 'type': The QName value '{http://www.w3.org/2001/XMLSchema}EmailString' does not resolve to a(n) type definition., line 4

Пожалуйста помоги.


person user3432909    schedule 18.03.2014    source источник


Ответы (2)


Это сработает, если вы сделаете:

EmailString = Unicode(128, pattern='[^@]+@[^@]+', type_name="EmailStringType")

Этот шаблон является лишь примером, вы можете найти лучшие варианты.

person Burak Arslan    schedule 18.03.2014
comment
Спасибо работает отлично. Однако расстраивает тот пример из документации, который вылетает =) - person user3432909; 20.03.2014

После нескольких часов исследований я обнаружил, что это также работает, если вы делаете class EmailString(Unicode(pattern='[^@]+@[^@]+')): __namespace__ = 'tempuri.org' __type_name__ = 'EmailString'

Похоже, что атрибуты метакласса EmailString не должны быть перезаписаны, и тогда он работает. Вместо этого вы должны поместить свою настройку в конструктор расширенного класса (в данном случае Unicode).

person user3432909    schedule 20.03.2014