SlideShare ist ein Scribd-Unternehmen logo
1 von 14
Downloaden Sie, um offline zu lesen
API XML basada en pyxser




                                   API XML basada
                                      en pyxser




Daniel Molina Wegener (coder.cl)   API XML basada en pyxser   6 de noviembre de 2011   1 / 14
API XML basada en pyxser

                                   Daniel Molina Wegener

                                      http://coder.cl/
                                      @damowe en twitter

                        Copyright c 2011 Daniel Molina Wegener




Daniel Molina Wegener (coder.cl)      API XML basada en pyxser   6 de noviembre de 2011   2 / 14
Tabla de Contenidos
1    ¿Que es pyxser?
2    ¿C´mo esta dise˜ado?
       o            n
3    ¿Que ventajas tiene?
4    ¿Que necesita?
5    Decorador para Django
6    Uso en una Vista
7    get class()
8    Selector de Atributos
9    Filtro para Classes
10   Resultado XML
11   FIN

 Daniel Molina Wegener (coder.cl)   API XML basada en pyxser   6 de noviembre de 2011   3 / 14
¿Que es pyxser?


¿Que es pyxser?




      Extensi´n Python escrita en C
             o
      Usa C99, Python C/API y libxml2
      Usa Python C Coding Style
      Provee Funciones de Serializaci´n
                                     o
      Provee Funciones de Deserializaci´n
                                       o
      Provee Funciones de Validaci´n
                                  o




Daniel Molina Wegener (coder.cl)       API XML basada en pyxser   6 de noviembre de 2011   4 / 14
¿C´mo esta dise˜ado?
                                     o            n


¿C´mo esta dise˜ado?
  o            n




      Usa un modelo de serializaci´n
                                  o
      Generaliza un modelo de objetos
      El modelo esta expuesto en un esquema
      El modelo esta expuesto en un DTD
      Se puede empotrar el esquema en WSDL y otros esquemas
      Se puede empotrar el DTD en otro DTD




Daniel Molina Wegener (coder.cl)            API XML basada en pyxser   6 de noviembre de 2011   5 / 14
¿Que ventajas tiene?


¿Que ventajas tiene?



      Serializa referencias circulares
      Serializa referencias cruzadas
      El algoritmo es O(n)
      Preserva informaci´n de los tipos
                        o
      Permite filtrar o seleccionar atributos
      Permite serializaci´n personalizada (p.e.: archivos)
                         o
      No se cae cuando encuentra referencias cruzadas
      No se cae cuando encuentra referencias circulares




Daniel Molina Wegener (coder.cl)           API XML basada en pyxser   6 de noviembre de 2011   6 / 14
¿Que necesita?


¿Que necesita?




      Compilador que soporte C99
      Librerias de Desarrollo Python
      Librerias de Desarrollo LibXML2
      Corre en Linux, BSD, Windows, Mac OS X (cross platform)
      Que el manual sea le´
                          ıdo




Daniel Molina Wegener (coder.cl)      API XML basada en pyxser   6 de noviembre de 2011   7 / 14
Decorador para Django


Decorador para Django


def render_to_xml(**pyxser_args):
    def outer(f):
        @wraps(f)
        def inner_xml(request, *args, **kwargs):
            result = f(request, *args, **kwargs)
            r = HttpResponse(mimetype=’text/xml’)
            render = pyxser.serialize(obj=result,
                                      **pyxser_args)
            r.write(render)
            return r
        return inner_xml
    return outer


Daniel Molina Wegener (coder.cl)             API XML basada en pyxser   6 de noviembre de 2011   8 / 14
Uso en una Vista


Uso en una Vista



@require_http_methods(["GET", "OPTIONS", "HEAD"])
@login_required()
@render_to_xml(selector=do_value_attrs, depth=2)
@protect_exception()
def get_model_object(request, model=None, oid=None):
    db_model = get_class(model)
    obj = db_model.objects.get(pk=oid)
    return obj




Daniel Molina Wegener (coder.cl)        API XML basada en pyxser   6 de noviembre de 2011   9 / 14
get class()


get class()



def get_class(kls):
    try:
        parts = kls.split(’.’)
        module = ’.’.join(parts[:-1])
        m = __import__(module)
        for comp in parts[1:]:
            m = getattr(m, comp)
        return m
    except:
        return False




 Daniel Molina Wegener (coder.cl)   API XML basada en pyxser   6 de noviembre de 2011   10 / 14
Selector de Atributos


Selector de Atributos



def do_value_attrs(o):
    values = dict()
    if hasattr(o, ’_meta’) and hasattr(o._meta, ’fields’):
        for fldn in o._meta.fields:
            if is_allowed_class(fldn):
                values[fldn.name] = getattr(o, fldn.name)
    else:
        for kw in o.__dict__:
            values[kw] = getattr(o, kw)
    return values




Daniel Molina Wegener (coder.cl)            API XML basada en pyxser   6 de noviembre de 2011   11 / 14
Filtro para Classes


Filtro para Classes



settings.DENIED_FIELDS = [’user’, ’customer’]
settings.DENIED_CLASSES = [’Related’, ’Foreign’, ’Many’]
def is_allowed_class(fld):
    for nm in settings.DENIED_CLASSES:
        if nm in fld.__class__.__name__:
            return False
    for nm in settings.DENIED_FIELDS:
        if nm in fld.name:
            return False
    return True




 Daniel Molina Wegener (coder.cl)         API XML basada en pyxser   6 de noviembre de 2011   12 / 14
Resultado XML


Resultado XML


<?xml version="1.0" encoding="utf-8"?>
<pyxs:obj xmlns:pyxs="http://projects.coder.cl/pyxser/model/"
          version="1.0" type="Marca"
          module="prod.models" objid="id3128007116">
  <pyxs:prop type="unicode" name="nombre" size="4">
    Sony
  </pyxs:prop>
  <pyxs:prop type="long" name="id">1</pyxs:prop>
  <pyxs:prop type="unicode" name="slug" size="4">
    sony
  </pyxs:prop>
</pyxs:obj>



Daniel Molina Wegener (coder.cl)      API XML basada en pyxser   6 de noviembre de 2011   13 / 14
FIN


FIN




                                   Preparado con LTEX
                                                 A
                          Compilado el 6 de noviembre de 2011
                         Coyright c 2011 Daniel Molina Wegener




Daniel Molina Wegener (coder.cl)    API XML basada en pyxser   6 de noviembre de 2011   14 / 14

Weitere ähnliche Inhalte

Ähnlich wie API XML basada en pyxser bajo Django

Introducción a Android
Introducción a AndroidIntroducción a Android
Introducción a Androidmcanalesc94
 
Django - Plataforma de sitios web
Django - Plataforma de sitios webDjango - Plataforma de sitios web
Django - Plataforma de sitios webjcarazo
 
Greach - Volando con Griffon
Greach - Volando con GriffonGreach - Volando con Griffon
Greach - Volando con GriffonAndres Almiray
 
Libro programacion orientadaaobjetosluisjoyanesaguilar
Libro programacion orientadaaobjetosluisjoyanesaguilarLibro programacion orientadaaobjetosluisjoyanesaguilar
Libro programacion orientadaaobjetosluisjoyanesaguilarIgnacio Fernandez Paba
 
Programación orientada a objetos - luis joyanes aguilar
Programación orientada a objetos - luis joyanes aguilarProgramación orientada a objetos - luis joyanes aguilar
Programación orientada a objetos - luis joyanes aguilarHenry Upla
 
Programacion orientada-a-objetos-luis-joyanes-aguilar
Programacion orientada-a-objetos-luis-joyanes-aguilarProgramacion orientada-a-objetos-luis-joyanes-aguilar
Programacion orientada-a-objetos-luis-joyanes-aguilarHector Garcia
 
Seguridad en PDF: Adobe ¬¬
Seguridad en PDF: Adobe ¬¬Seguridad en PDF: Adobe ¬¬
Seguridad en PDF: Adobe ¬¬Alejandro Ramos
 
Tesis Licenciatura
Tesis LicenciaturaTesis Licenciatura
Tesis Licenciaturasergiovier
 
239984949 curso-android-pptx
239984949 curso-android-pptx239984949 curso-android-pptx
239984949 curso-android-pptxxavazque2
 
Desarrollo a aplicaciones . net (1)
Desarrollo a aplicaciones . net (1)Desarrollo a aplicaciones . net (1)
Desarrollo a aplicaciones . net (1)jenny21071
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2tonhonw
 

Ähnlich wie API XML basada en pyxser bajo Django (20)

Frameworks de templates y xml
Frameworks de templates y xmlFrameworks de templates y xml
Frameworks de templates y xml
 
Presentación appy/pod
Presentación appy/podPresentación appy/pod
Presentación appy/pod
 
Introduccion a python 3
Introduccion a python 3Introduccion a python 3
Introduccion a python 3
 
Introducción a Android
Introducción a AndroidIntroducción a Android
Introducción a Android
 
Net reflector
Net reflectorNet reflector
Net reflector
 
Welcome to Django
Welcome to DjangoWelcome to Django
Welcome to Django
 
Symfony 2 CMF
Symfony 2 CMFSymfony 2 CMF
Symfony 2 CMF
 
Django - Plataforma de sitios web
Django - Plataforma de sitios webDjango - Plataforma de sitios web
Django - Plataforma de sitios web
 
Greach - Volando con Griffon
Greach - Volando con GriffonGreach - Volando con Griffon
Greach - Volando con Griffon
 
Libro programacion orientadaaobjetosluisjoyanesaguilar
Libro programacion orientadaaobjetosluisjoyanesaguilarLibro programacion orientadaaobjetosluisjoyanesaguilar
Libro programacion orientadaaobjetosluisjoyanesaguilar
 
Programación orientada a objetos - luis joyanes aguilar
Programación orientada a objetos - luis joyanes aguilarProgramación orientada a objetos - luis joyanes aguilar
Programación orientada a objetos - luis joyanes aguilar
 
Programacion orientada-a-objetos-luis-joyanes-aguilar
Programacion orientada-a-objetos-luis-joyanes-aguilarProgramacion orientada-a-objetos-luis-joyanes-aguilar
Programacion orientada-a-objetos-luis-joyanes-aguilar
 
Seguridad en PDF: Adobe ¬¬
Seguridad en PDF: Adobe ¬¬Seguridad en PDF: Adobe ¬¬
Seguridad en PDF: Adobe ¬¬
 
Tesis Licenciatura
Tesis LicenciaturaTesis Licenciatura
Tesis Licenciatura
 
239984949 curso-android-pptx
239984949 curso-android-pptx239984949 curso-android-pptx
239984949 curso-android-pptx
 
Python
PythonPython
Python
 
Desarrollo a aplicaciones . net (1)
Desarrollo a aplicaciones . net (1)Desarrollo a aplicaciones . net (1)
Desarrollo a aplicaciones . net (1)
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 

API XML basada en pyxser bajo Django

  • 1. API XML basada en pyxser API XML basada en pyxser Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 1 / 14
  • 2. API XML basada en pyxser Daniel Molina Wegener http://coder.cl/ @damowe en twitter Copyright c 2011 Daniel Molina Wegener Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 2 / 14
  • 3. Tabla de Contenidos 1 ¿Que es pyxser? 2 ¿C´mo esta dise˜ado? o n 3 ¿Que ventajas tiene? 4 ¿Que necesita? 5 Decorador para Django 6 Uso en una Vista 7 get class() 8 Selector de Atributos 9 Filtro para Classes 10 Resultado XML 11 FIN Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 3 / 14
  • 4. ¿Que es pyxser? ¿Que es pyxser? Extensi´n Python escrita en C o Usa C99, Python C/API y libxml2 Usa Python C Coding Style Provee Funciones de Serializaci´n o Provee Funciones de Deserializaci´n o Provee Funciones de Validaci´n o Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 4 / 14
  • 5. ¿C´mo esta dise˜ado? o n ¿C´mo esta dise˜ado? o n Usa un modelo de serializaci´n o Generaliza un modelo de objetos El modelo esta expuesto en un esquema El modelo esta expuesto en un DTD Se puede empotrar el esquema en WSDL y otros esquemas Se puede empotrar el DTD en otro DTD Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 5 / 14
  • 6. ¿Que ventajas tiene? ¿Que ventajas tiene? Serializa referencias circulares Serializa referencias cruzadas El algoritmo es O(n) Preserva informaci´n de los tipos o Permite filtrar o seleccionar atributos Permite serializaci´n personalizada (p.e.: archivos) o No se cae cuando encuentra referencias cruzadas No se cae cuando encuentra referencias circulares Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 6 / 14
  • 7. ¿Que necesita? ¿Que necesita? Compilador que soporte C99 Librerias de Desarrollo Python Librerias de Desarrollo LibXML2 Corre en Linux, BSD, Windows, Mac OS X (cross platform) Que el manual sea le´ ıdo Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 7 / 14
  • 8. Decorador para Django Decorador para Django def render_to_xml(**pyxser_args): def outer(f): @wraps(f) def inner_xml(request, *args, **kwargs): result = f(request, *args, **kwargs) r = HttpResponse(mimetype=’text/xml’) render = pyxser.serialize(obj=result, **pyxser_args) r.write(render) return r return inner_xml return outer Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 8 / 14
  • 9. Uso en una Vista Uso en una Vista @require_http_methods(["GET", "OPTIONS", "HEAD"]) @login_required() @render_to_xml(selector=do_value_attrs, depth=2) @protect_exception() def get_model_object(request, model=None, oid=None): db_model = get_class(model) obj = db_model.objects.get(pk=oid) return obj Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 9 / 14
  • 10. get class() get class() def get_class(kls): try: parts = kls.split(’.’) module = ’.’.join(parts[:-1]) m = __import__(module) for comp in parts[1:]: m = getattr(m, comp) return m except: return False Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 10 / 14
  • 11. Selector de Atributos Selector de Atributos def do_value_attrs(o): values = dict() if hasattr(o, ’_meta’) and hasattr(o._meta, ’fields’): for fldn in o._meta.fields: if is_allowed_class(fldn): values[fldn.name] = getattr(o, fldn.name) else: for kw in o.__dict__: values[kw] = getattr(o, kw) return values Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 11 / 14
  • 12. Filtro para Classes Filtro para Classes settings.DENIED_FIELDS = [’user’, ’customer’] settings.DENIED_CLASSES = [’Related’, ’Foreign’, ’Many’] def is_allowed_class(fld): for nm in settings.DENIED_CLASSES: if nm in fld.__class__.__name__: return False for nm in settings.DENIED_FIELDS: if nm in fld.name: return False return True Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 12 / 14
  • 13. Resultado XML Resultado XML <?xml version="1.0" encoding="utf-8"?> <pyxs:obj xmlns:pyxs="http://projects.coder.cl/pyxser/model/" version="1.0" type="Marca" module="prod.models" objid="id3128007116"> <pyxs:prop type="unicode" name="nombre" size="4"> Sony </pyxs:prop> <pyxs:prop type="long" name="id">1</pyxs:prop> <pyxs:prop type="unicode" name="slug" size="4"> sony </pyxs:prop> </pyxs:obj> Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 13 / 14
  • 14. FIN FIN Preparado con LTEX A Compilado el 6 de noviembre de 2011 Coyright c 2011 Daniel Molina Wegener Daniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 14 / 14