Ainda não consegui parar e escrever sobre Rails aqui no blog, mas tenho descoberto coisas interessantes de Django. O novo desafio, aqui no trabalho, foi criar e testar um Middleware que tinha a função de identificar o User-Agent de um request e setar alguns parâmetros para que a aplicação pudesse se desenvolver a partir daí. É mais ou menos parecido com o que já foi mencionado aqui, anteriormente.
from django.conf import settings
from app.pub.structure import *
from django import http
import re
class IdentifyMiddleware(object):
def process_request(self, request):
# LIST PERFIS
perfil = Perfil()
perfis = perfil.all()
for p in perfis:
if p.regular_expression:
logging.info("Identify User: regexp [%s]" % p.regular_expression)
r = re.compile(p.regular_expression, re.IGNORECASE)
if r.search(request.META['HTTP_USER_AGENT']):
request.perfil = p
return
# SET PERFIL NONE
perfil.name = "none"
request.perfil = perfil
Esse Middleware lista expressões regulares guardadas em um banco de dados e compara com o User-Agent do request. Uma vez encontrada, é setado uma propriedade no request chamada perfil, identificando assim o tipo de request que estamos trabalhando. O teste realizado no Middleware era verificar se o request realmente trazia o parâmetro perfil setado.
#!/usr/bin/python
# vim: ai ts=4 sts=4 et sw=4
import unittest
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
#from django.test import TestCase
from django.http import HttpRequest
from app.handset.identify import IdentifyMiddleware
from django.conf import settings
class TestIdentify(unittest.TestCase):
def _get_request(self, path):
request = HttpRequest()
request.META = {
'SERVER_NAME': settings.CDA_URL
}
request.path = path_info = "/%s" % path
return request
def testPerfilIphone(self):
request = self._get_request('identify')
request.META = {
'HTTP_USER_AGENT':'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A538a Safari/419.3'
}
IdentifyMiddleware().process_request(request)
self.assertEquals(request.perfil.name, 'IPhone')
def testPerfilStandard(self):
request = self._get_request('identify')
request.META = {
'HTTP_USER_AGENT':'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7'
}
IdentifyMiddleware().process_request(request)
self.assertEquals(request.perfil.name, 'standard')
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TestIdentify)
unittest.TextTestRunner(verbosity=2).run(suite)
O teste por si só se explica, mas vale salientar o ponto onde foi utilizado a biblioteca HttpRequest do próprio Django para montar o request. Outro ponto é quando o teste instancia o método IdentifyMiddleware().process_request(request) do Middleware, o parâmetro request se mantem por referência, não necessitando de um retorno (return alguma coisa) do Middleware para continuar a testar o parâmetro perfil adicionado ao request.
Com certeza o próximo texto será sobre Rails, que é um framework que voltei a estudar muito para desenvolver projetos pessoais. Até lá.