Fazendo um Middleware para pegar informações

Postado em: Fevereiro 7, 2008
Tags: django

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 AtividadesDosUsuarios

atividade = 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!



Não será divulgado!

Um site válido!

Outros

Hospedagem gratuitamente cedida pela TeHospedo - Hospedagem de sites, registro de dominios, revenda de hospedagem, streaming
TeHospedo - Hospedagem de sites, registro de dominios, revenda de hospedagem, streaming

django donated

pyconbrasil

Divulgue o Nerdson

Firefox 3 - Brazil

BlogBlogs

Add to Technorati Favorites

Django
Desenvolvido com Django, Aptana, Gimp, Inkscape | Rafael Campos de Bastiani - RFDev.org - 2008