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