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 ;)