API XML basada en pyxser bajo Django

14
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

description

API XML basada en pyxser bajo Django

Transcript of API XML basada en pyxser bajo Django

API XML basada en pyxser

API XML basadaen 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 ¿Como esta disenado?

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?

Extension Python escrita en C

Usa C99, Python C/API y libxml2

Usa Python C Coding Style

Provee Funciones de Serializacion

Provee Funciones de Deserializacion

Provee Funciones de Validacion

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

¿Como esta disenado?

¿Como esta disenado?

Usa un modelo de serializacion

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 informacion de los tipos

Permite filtrar o seleccionar atributos

Permite serializacion personalizada (p.e.: archivos)

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 LATEXCompilado 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