Django, soporte para dispositivos móviles

Una de las cosas que siempre me he preguntado a la hora de desarrollar un proyecto, pensando en la versión móvil del mismo, es si sería mejor hacerlo en la misma url (detectando UserAgent) o derivar a un subdominio (mobile.app.com).

La verdad es que no hay una respuesta universal y cada maestrillo dice un poco lo que le parece o interesa. Tampoco he encontrado nada demasiado oficial en la documentación de Google con lo que - como buen vago - he decidido probar detectando UserAgent y dejar la procastinación para más adelante.

Como todo esto es para una micro aplicación casera en la que puedo jugar tranquilamente con gaseosa y otras combinaciones de alquimia, he probado a hacerlo en Django de la forma más sencilla que he encontrado, en tres simples pasos que paso a detallar, valga la repugnancia.

Primero instalamos minidetector para usarlo como MiddleWare en la aplicación y que compruebe las cabeceras de cada petición, él se encargará de decirnos qué es móvil y qué no lo es:

$ pip install minidetector

Lo siguiente es configurar la aplicación para que haga uso de minidetector, así que agregamos a settings.py la aplicación y el MiddleWare de la misma:

MIDDLEWARE_CLASSES = (
    ...
    'minidetector.Middleware'
)
INSTALLED_APPS = (
    ...
    'minidetector',
)

Llegados a este punto ya hemos hecho lo más complicado, tan solo nos queda que crear las condicionales en las vistas de forma que se cargue un template u otro dependiendo de la respuesta de minidetector. Con dos ejemplos creo que bastará:

Function Based Views

def index(request, template_name='index.html'):
    if request.mobile:
        template_name='mobile/index.html'

Class Based Views

class index(CreateView):
    template_name = "index.html"
    context_object_name = "whatever"

    def get_context_data(self, **kwargs):
        if self.request.mobile:
            self.template_name='mobile/index.html'

Y ya tendríamos nuestra aplicación preparada tanto para dispositivos móviles como para desktops de toda la vida. ¿Sencillo?, pues a hacer uso de ello que, como véis, no cuesta demasiado ;)

django code

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.