Estamos vivendo o que alguns chamam de “explosão mobile”, um tempo onde um número cada vez maior de dispositivos móveis — como tablets e smartphones — se tornam parte significante da Web. Esta é a razão pela qual ter seu website preparado para tais dispositivos é cada vez mais importante.
Felizmente, Django é um dos poucos frameworks web que tornam este um problema simples de solucionar.
Como resolvemos este problema
Um jeito simples é criar um módulo settings.py separado para a versão “mobile”. Isso nos permite rodar dois sites diferentes reusando a mesma base de código. Além disso, cada versão pode ter seu próprio diretório de templates, configurações de URL, etc.
Vamos fazer isso. No diretório-raíz do projeto, crie um arquivo m_settings.py com o seguinte conteúdo:
# Arquivo: myproject/m_settings.py """Configurações para a versão "mobile" do website. """ # Carrega as configurações padrão from settings import * # Domínio "m.mydomain.com" SITE_ID = 2 PREPEND_WWW = False # Usado em outras partes do código para determinar qual versão está rodando DEFAULT_VERSION = False MOBILE_VERSION = True # URLs para a versão mobile ROOT_URLCONF = 'myproject.m_urls' # Templates para a versão mobile TEMPLATE_DIRS = ( os.path.normpath(os.path.dirname(__file__) + '/template/mobile'), ) # Outras configurações...
O fato de os dois sites compartilharem a mesma base de código não significa que eles devem ter as mesmas configurações de URL. Aliás, o normal é que versões próprias para dispositivos móveis sejam mais simples, com uma quantidade reduzida de mapeamentos de URLs.
Para definir as configurações de URL da versão mobile, crie um arquivo m_urls.py com o seguinte conteúdo:
# Arquivo: myproject/m_urls.py """Mapeamentos de URL para a versão "mobile". """ from django.conf import settings from django.conf.urls.defaults import * # from django.contrib import admin # admin.autodiscover() handler404 = 'website.views.error_404_handler' handler500 = 'website.views.error_500_handler' # URLs urlpatterns = patterns('', # I18N (r'^i18n/', include('django.conf.urls.i18n')), # Apps internas (r'^contact/', include('contact.urls')), # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # (r'^admin/', include(admin.site.urls)), # Outras configurações... )
Perceba que, neste exemplo em particular, a app Admin não é acessível através da versão mobile. Isso apenas serve para mostrar que temos total liberdade para estruturar ambas as versões de diferentes formas, sem muitas dificuldades.
Desenvolvendo
Você certamente já sabe como rodar o servidor de desenvolvimento para a versão padrão. O que a maioria dos desenvolvedores desconhece, entretanto, é que é possível escolher qual a porta e/ou módulo settings.py deve ser usado pelo script, o que nos permite rodar um servidor para cada versão do nosso site:
# Terminal 1: versão padrão $ python manage.py runserver 8000 # Terminal 2: versão mobile $ python manage.py runserver --settings=m_settings 8001
Pronto, agora é só continuar com o desenvolvimento da forma que você já está acostumado.
Testando
Você provavelmente notou que temos duas configurações que podem ser usadas para determinar qual versão do site está rodando, DEFAULT_VERSION e MOBILE_VERSION.
Por isso, é só uma questão de checar tais configurações quando for necessário fazer coisas diferentes em cada uma das versões do site. Isso é particularmente útil quando você tem uma app usada em ambas as versões e quer criar testes para cada uma das versões:
# Arquivo: myproject/myapp/tests/__init__.py """Testes para MyApp. """ from django.conf import settings if getattr(settings, 'DEFAULT_VERSION', False): # Testa a versão padrão from default_models_tests import * from default_navigation_tests import * if getattr(settings, 'MOBILE_VERSION', False): # Testa a versão mobile from mobile_models_tests import * from mobile_navigation_tests import *
Você pode rodar os testes para cada versão de uma forma semelhante a que fizemos com o comando runserver:
# Versão padrão $ python manage.py test [appname...] # Versão mobile $ python manage.py test --settings=m_settings [appname...]
Colocando em produção
Apesar do que você possa achar, esta é a parte fácil.
Uma vez que a forma recomendada de colocar Django em produção é com Apache e mod_wsgi, é possível que você já tenha um arquivo WSGI parecido com o seguinte:
import os, sys APPS_PATH = '/home/user/wsgi_apps' MYPROJECT_PATH = '%s/myproject' % APPS_PATH # Eggs de terceiros import site site.addsitedir('/home/user/.python/lib') sys.path += [APPS_PATH, MYPROJECT_PATH] os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
Tudo que precisamos fazer é configurar um outro sub-domínio WSGI no nosso servidor (ex: m.mywebsite.com) que referencia o seguinte arquivo de configurações WSGI:
import os, sys APPS_PATH = '/home/user/wsgi_apps' MYPROJECT_PATH = '%s/myproject' % APPS_PATH # Eggs de terceiros import site site.addsitedir('/home/user/.python/lib') sys.path += [APPS_PATH, MYPROJECT_PATH] os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.m_settings' # Esta linha import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
A única diferença entre esses dois arquivos WSGI é que cada um aponta para um módulo settings.py diferente. E não, você não precisa ter uma cópia do site para cada versão, afinal estamos usando a mesma base de código para ambas as versões, lembra?
Minimizando o tráfego
Por incrível que pareça, nem todo mundo dispõe de conexões ultra-rápidas. Por isso, é muito importante que você mantenha seus sites tão leves quanto possível.
Existem vários projetos open source que podem ajudar nessa parte. Um deles é o django-compress, uma app Django que fornece um sistema automatizado para compressão de arquivos CSS e JavaScript.
Aliás, não importa se seus websites são para dispositivos móveis ou não; você deve sempre tentar minimizar o tráfego.
O que falta?
Ainda temos um pequeno problema: quando alguém visita a versão padrão do site através de um dispositivo móvel, ou vice-versa, eles não são redirecionados para a versão apropriada. Mas isso é assunto para um próximo artigo!
Posts em Português
Posts in English
Pingback: Tweets that mention Django Para Dispositivos Móveis | Destaqueblog -- Topsy.com
Excelente post, Daniel.
Já está em meus favoritos.
Daniel, achei isso muitíssimo interessante e um bem escrito post!
Obrigado pelos elogios galera!