Djangobile, adecuación multidispositivo en django

Slides:



Advertisements
Presentaciones similares
Introducción a la programación (Clase 2)
Advertisements

Introducción a Django Manuel Kaufmann Septiembre de 2009
Programación Interactiva Fundamentos de Programación
Lenguajes de programación
Te presento a Python Qué es Python? Lenguaje interpretado
Tema 2: Lenguaje PHP básico
Symfony La Vista y el Controlador (MVC)
Preguntas tipo test (Tema I)
Profesor: Ing. Matías Vallerga Ayudante: Lic. Cristian Kenny Estilo de Programación.
Programación Python.
ESTRUCTURAS DE SECUENCIA
Algoritmo y Estructura de Datos I I Facultad de Ingeniería y Arquitectura Juan José Montero Román. Sesión 6.
Introducción a la Computación (8va Semana) Lunes 23 de Abril del 2007
Facultad de Ingeniería y Arquitectura Introducción a la Computación 2006 – II (8va Semana) Lunes 25 de Setiembre del 2006 Juan José Montero Román.
Método en Java.
SINTAXISYSEMANTICA. Tengo la impresión de que Java fue diseñado para hacer que fuera difícil escribir mal código, mientras que Python está diseñado para.
Repaso/resumen Introducción a la programación Orientada a Objetos 1.Strings 2.Archivos 3.Clases y objetos 4.Herencia 5.Ventanas 6.Dibujos y Gráficos.
Elseif en PHP Programación en Internet II. Elseif en PHP Programación en Internet II Universidad de Guadalajara | Centro Universitario de la Costa Elseif.
Computación II Repaso de java Karina Figueroa Mora.
Diseñando la arquitectura de aplicaciones empresariales. Acceso al SQL Server.- Autenticación de usuario:
Operadores lógicos en PHP Programación en Internet II.
MODELO DE APLICACIONES DISTRIBUIDAS EN INTERNET.
Sesión 12: Python (3) – Estructura Decisión. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática.
Sesión 14: Python (5) – Aplicaciones. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática.
IOS for Dummies Consumiendo una API REST con AFNetworking y Mantle.
Programación PHP: Lenguaje PHP.
Hackear un Sitio Web. Claudio
JUEGO: Familia en Cascada.  ¿Cuáles son las salidas?
U6 Ejercicios ¡¡¡¡PREPARANDO LA PEC1!!!!. ERRORES FRECUENTES EN test de 8/10/2015 Nombre de la función no muy bueno : debe ser ImprimeNombreMes o ImprimeMesEnLetra.
U11: Recursividad Otra manera de hacer bucles Dicen algunos pedagogos que conceptualmente mas sencilla.
U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad.
U9 Estructuras: Agrupación de elementos de distinto tipo 1 Barajar complejidad.
INS-204 Fundamentos de Programacion notas de clase, objetivo, programar en Python con nivel medio de destreza.
 Mariana Herrera  Paula Zapata  903  Jornada mañana.
Curso de Python Clase 4 Dpto. Telemática CUJAE Curso
Diseño de aplicaciones móviles
DISTRIBUCIÓN MULTICANAL DE CONTENIDOS DE SALUD PARA LA CIUDADANÍA
WordPress REST API
INTEGRACIÓN DE LAS TECNOLOGÍAS EN SISTEMAS
Clase 9: Repaso/Resumen
Agustín J. González Programación de Sistemas: ELO-330
Nombres: Sebastián torrado Leonardo barragán curso: 901
Jornadas de Software Libre 2007 JSL2007
Jair López Daniel González 903 JM
TRABAJO DE TITULACIÓN Cristian Tapia.
METODOLOGÍA DE SISTEMAS
Lenguaje de Programación C en pocas palabras
Base de Datos II Almacenamiento.
Hacer un Módulo en Drupal 8
NAVEGADORES WEB Londoño Diana 901-J.M-2016.
Mi Experiencia Personal
Karen Perez – Alejandra Delgado 903
Ecosistema abierto para la representación espacial de sistemas de información IDESAN, caso de uso aplicado a la gestión sanitaria en la Conselleria de.
Metodología de la programación
Orígenes Funciones Condicionales
HISTORIA El lenguaje fue creado por Yukihiro "Matz" Matsumoto, quien empezó a trabajar en Ruby el 24 de febrero de 1993, y lo presentó al público en el.
Fundamentos de programación en TIG 4. Aptana y Arcpy
Ingeniería del Software
Paul Leger Funciones Paul Leger
PROGRAMACIÓN (2).
CC 1002: Introducción a la Programación Clase 15: Estructuras mutables
Fundamentos del analisis de sistemas de Información Integrantes: Cavero Parraguez, Jesús Espinoza Paz, Julio Daniel Sandoval Chanamé, Kazuo Santisteban.
Construyendo Nuestras Propias Funciones
Variables, Expresiones y Enunciados
Introducción – Parte 4 PYTHON PARA TODOS Hablemos con Python.
Más Patrones de Ejecución Condicional
GC-F-004 V.01 CENTRO DE INDUSTRIA Y LA CONSTRUCCIÓN REGIONAL TOLIMA.
ESTRUCTURA DE LOS SISTEMAS OPERATIVOS CHACALIAZA BOZA MARGARET AMARLLY.
ESTRUCTURA DE LOS SISTEMAS OPERATIVOS CHACALIAZA BOZA MARGARET AMARLLY.
PROXY MARISOL LUNA MARTÍNEZ EUNICE CASTILLO ORFILIA ANGULO MARLOVY.
Transcripción de la presentación:

Djangobile, adecuación multidispositivo en django Javier de la Rosa versae@yaco.es

Una arquitectura al estilo J2ME. Un SDK como el del iPhone. ¿Qué NO es? Una arquitectura al estilo J2ME. Un SDK como el del iPhone. Un entorno de desarrollo de webs adaptadas como Aptana. Un ICM™ como BuzzCast™ de Volantis.

¿Qué es Djangobile? “Una extensión de Django que permite identificar el dispositivo que realiza la petición y ofrecer un contenido u otro”.

Enriquecimiento de los proyectos Django tradicionales. Características Enriquecimiento de los proyectos Django tradicionales. N interfaces, una lógica. Directrices de MyMobileWeb, pero agilidad de Django. Futuro uso de estándares.

Tokenizer y Levenshtein. Context processors. Middlewares. Más... ¿En qué se basa? WURFL y PyWURFL. Tokenizer y Levenshtein. Context processors. Middlewares. Más...

Base de datos de dispositivos y sus capacidades. WURFL y PyWURFL Base de datos de dispositivos y sus capacidades. Estándar. Libre y mantenida. “Apoyada” por el W3C.

Tokenizer y Levenshtein Cálculo de “distancias” entre cadenas de texto. Módulo Python muy rápido (binding C). Algoritmos mejorados: Levenshtein y Jaro- Winkler.

Función Python muy sencilla. Context processor (I) Función Python muy sencilla. Establece nuevas variables a usar en las plantillas. Recibe un objeto HttpRequest. Devuelve un diccionario con las nuevas adiciones al contexto.

Context processor (II) def mobile(request): user_agent = request.META.get('HTTP_USER_AGENT', None) if not user_agent: return {}     if hasattr(request, 'device'):         device = request.device         if device.get('user_agent', False) != user_agent:             device = get_device(user_agent)             request.session['device'] = device     elif request.session.test_cookie_worked():         request.session.delete_test_cookie()         device = request.session.get('device', False)         if not device:     else:         device = get_device(user_agent)         request.session['device'] = device     request.session.set_test_cookie()     return {'device': device}

Capa intermedia entre petición y respuesta. Middleware (I) Capa intermedia entre petición y respuesta. Sencillo sistema de “plugins” de bajo nivel. Permite alterar la salida y/o entrada de Django.

Middleware (II) class DjangoMobileMiddleware(object):     def process_response(self, request, response):         if hasattr(settings, 'DEBUG') and settings.DEBUG:             print "[%s] From %s (%s): %s (%s)" % (                     datetime.today().strftime("%d/%b/%Y %H:%M:%S"),                     request.device.get('id', ''),                     request.device.get('preferred_markup', ''),                     request.device.get('user_agent', ''),                     request.META.get('HTTP_USER_AGENT', '')                 )         return response     def process_request(self, request):         device = mobile(request)['device']         setattr(request, 'device', device)         return None

Sesiones y cookies: request.session['device'] Más Sesiones y cookies: request.session['device'] Shorcuts: djangobile.shortcuts.render_to_response Loaders: djangobile.template.loader.render_to_string djangobile.template.loader.select_template djangobile.template.loader.get_template Utils: djangobile.utils.get_device djangobile.utils.get_device_template_paths

Integración de transcodificación. Futuro Adopción de IDEAL. Integración de transcodificación. Proposición inteligente de contenido. Paginación automática. Templates por defecto. Integración con AppEngine.

Material: http://oswc.yaco.es/djangobile/ Más información Material: http://oswc.yaco.es/djangobile/ Código: http://code.google.com/p/djangobile Grupo de discusión: http://groups.google.com/group/djangobile Y yo mismo: versae at {gmail.com|yaco.es}

Instalación Descargar el proyecto del SVN svn co https://djangobile.googlecode.com/svn/trunk/djangobile Añadir el middleware: MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.doc.XViewMiddleware', 'djangobile.middleware.DjangoMobileMiddleware', ) Establecer el context processor en settigns.py: TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.auth', 'django.core.context_processors.debug', 'django.core.context_processors.i18n', 'django.core.context_processors.media', 'djangobile.context_processors.mobile', )

Uso (I) En vistas: def vista(request): if request.device['is_mobile_device']: # Hacer algo para móviles elif request.device['is_pda_device']: # Hacer algo para PDA's elif request.device['is_pc_device']: # Hacer algo para PC's else: # Hacer algo en el resto de casos ¿? # Es posible preguntar por una capacidad en concreto if request.device['brand_name'].lower() == 'nokia': # Hacer algo para los Nokia

Directorio de plantillas: Uso (II) En vistas y plantillas: # views.py from django.template import RequestContext from djangobile.shortcuts import render_ro_response def vista(request): # Código return render_to_response('test.html', {}, context_instance=RequestContext(request)) Directorio de plantillas:

Opciones en settings.py WURFL_CLASS USER_AGENT_SEARCH_ALGORITHM: Tokenizer, JaroWinkler and LevenshteinDistance. DEVICE_SEARCH_ORDER: id, user_agent, fall_back, preferred_markup, model_name, brand_name.

¿Preguntas?

Gracias