API XML basada en pyxser bajo Django

  • 214 views
Uploaded on

API XML basada en pyxser bajo Django

API XML basada en pyxser bajo Django

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
214
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. API XML basada en pyxser API XML basada en pyxserDaniel 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 WegenerDaniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 2 / 14
  • 3. Tabla de Contenidos1 ¿Que es pyxser?2 ¿C´mo esta dise˜ado? o n3 ¿Que ventajas tiene?4 ¿Que necesita?5 Decorador para Django6 Uso en una Vista7 get class()8 Selector de Atributos9 Filtro para Classes10 Resultado XML11 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 oDaniel 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 DTDDaniel 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 circularesDaniel 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´ ıdoDaniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 7 / 14
  • 8. Decorador para DjangoDecorador para Djangodef 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 outerDaniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 8 / 14
  • 9. Uso en una VistaUso 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 objDaniel 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 AtributosSelector de Atributosdef 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 valuesDaniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 11 / 14
  • 12. Filtro para ClassesFiltro para Classessettings.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 XMLResultado 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. FINFIN Preparado con LTEX A Compilado el 6 de noviembre de 2011 Coyright c 2011 Daniel Molina WegenerDaniel Molina Wegener (coder.cl) API XML basada en pyxser 6 de noviembre de 2011 14 / 14