Middleware é um framework de solicitações dentro do Django que corresponde aos processos de request/response (requisição/resposta). È simples é um “plugin” de low-level do sistema global para alterar as entradas e saídas do Django.
Vamos à prática, a nossa intenção aqui é fazer um middleware para pegar as informações dos visitantes de um site para depois gerar estatísticas com as mesmas, mas essa ultima parte fica a cargo de sua imaginação.
Vamos começar com o model, crie um model conforme o abaixo:
import datetime
class AtividadesDosUsuarios(models.Model):
adu_data = models.DateTimeField(help_text="Data de inicio do processo", default=datetime.datetime.now(), db_index=True)
adu_request_url = models.CharField(max_length=800, db_index=True)
adu_referencia_url = models.URLField(verify_exists=False, db_index=True, blank=True, null=True)
adu_endereco_cliente = models.IPAddressField(blank=True, null=True)
adu_host_cliente = models.CharField(max_length=256, blank=True, null=True)
adu_browser_info = models.TextField(null=True, blank=True)
adu_erro = models.TextField(null=True, blank=True)def __unicode__(self):
return '%s: %s' % (self.adu_data, self.adu_request_url)
class Admin:
pass
É um model simples, nele usamos alguns atributos e tipos bem interessantes da model api, mas não entrarei em detalhes com relação a eles.
Agora vamos criar um arquivo chamado middleware.py ou um nome de sua preferência e nele vamos ter o seguinte código:
# -*- coding: utf-8 -*-
from datetime import datetime
from djblog.blog.models import AtividadesDosUsuariosatividade = False
class Atividades(object):
def process_request(self,request):
if not request.user.is_authenticated():
if request.META.has_key('HTTP_REFERER'):
referer = request.META['HTTP_REFERER']
else:
referer = ''
if request.META.has_key('REMOTE_HOST'):
host = request.META['REMOTE_HOST']
else:
host = ''
self.Atividades = AtividadesDosUsuarios(adu_data = datetime.now(),
adu_request_url = request.META['PATH_INFO'],
adu_referencia_url = referer,
adu_endereco_cliente = request.META['REMOTE_ADDR'],
adu_host_cliente = host,
adu_browser_info = request.META['HTTP_USER_AGENT'])
atividade = True
self.Atividades.save()
def process_exception(self,request,exception):
if atividade:
self.Atividades.adu_erro = exception
self.Atividades.save()
Esse código é o que esta sendo usado por esse blog no momento, se você tiver alguma idéia para melhorá-lo fique a vontade para se pronunciar.
O def process_request(object) é chamado pelo Django a cada requisição e depois ele decide qual view vai executar. Process_request() deve retornar um None ou um HttpResponse.
Com o if not request.user.is_authenticated() eu verifico se tem um usuário ativo no Django, se não tiver ai sim pode gravar as informações, eu fiz isso pois não quero saber quantas vezes eu entrei no blog e sim os visitantes.
Nos if´s seguintes verifico se tem as informações de HTTP_REFERER que quer dizer se o usuário clico em algum link de outro site para chegar ao meu, e o REMOTE_HOST que é praticamente inútil nesse caso pois não á essa informação.
Mais sobre o request/response pode ser visto aqui http://www.djangoproject.com/documentation/request_response/
Nas linhas seguintes eu mando o model para a classe Atividades no qual vai passar a conter o objeto AtividadesDosUsuarios e com isso poderei executar o save() para os dados serem salvos.
Logo em baixo temos o process_exception(), nele eu verifico se teve alguma atividade com a minha variável, se teve então se ouve algum erro no processo eu o gravo no campo adu_erro.
Vamos abrir o nosso settings.py e no MIDDLEWARE_CLASSES vamos adicionar o nosso middleware, no meu caso ficou assim: ‘djblog.blog.middleware.Atividades’
Mais informações sobre middleware pode ser encontrado aqui http://www.djangoproject.com/documentation/middleware/
Pronto, bem simples e muito útil!
Feeds RSS
Ultimas Mensagens
Tags (categorias)
Links
Histórico