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