terça-feira, 14 de agosto de 2012

Interface REST no Django

Uma das bibliotecas mais interessantes que encontrei foi a djangorestframework. Ela disponbiliza qualquer classe da sua aplicação sob várias formas de output, tais como REST, json, xml, etc.

O mais interessante da biblioteca é que ela não é intrusiva e é altamente plugável, ou seja, você pode adicionar as funcionalidades da biblioteca sem precisar alterar quase nenhuma linha da sua aplicação.

A instalação é bem simples para ambientes Debian/Ubuntu:

sudo apt-get install python-pip python-dev build-essential
sudo pip install --upgrade pip
sudo pip install djangorestframework

Uma vez instalada, inclua a biblioteca no seu projeto, alterando o settings.py


INSTALLED_APPS += (
    'djangorestframework',
)

Por fim, defina quais as classes que você vai querer disponibilizar, no url.py


Por exemplo, se você tiver uma classe chamada Area, basta definir um "ModelResource" que irá publicar essa classe:

# -*- coding: utf-8 -*-

from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin

from djangorestframework.resources import ModelResource
from djangorestframework.views import ListOrCreateModelView, InstanceModelView

from categorizacao.models import Area

class AreaResource(ModelResource):
    model = Area

urlpatterns = patterns('',
    # API
    # Area
    url(r'^api/area/$',
        ListOrCreateModelView.as_view(resource=AreaResource)),
    url(r'^api/area/(?P<pk>[^/]+)/$',
        InstanceModelView.as_view(resource=AreaResource)),

    # Home
    url(r'^$', 'categorizacao.views.home', name='home'),

    # Admin
    url(r'^admin/', include(admin.site.urls)),
)

Por fim, faça o teste:

http://127.0.0.1:8000/api/area/

Onde /area/ é o nome da sua classe.

Repare que essa API abre a sua classe tanto a leitura como para gravação.
Ou seja, sem a programação de uma autenticação, as 2 views ListOrCreateModelViewInstanceModelView  abrem a classe para que qualquer pessoa possa incluir/alterar ou excluir dados na classe/tabela.

Em um próximo post, vou tentar mostrar como foi a minha experimentação dos recursos de autenticação da biblioteca. Agradecimentos especiais ao Ricardo Dani que me mostrou a biblioteca e montou os primeiros testes e tutoriais.

quarta-feira, 9 de novembro de 2011

Iniciando o South em uma base já instalada

Bibliotecas escritas para o ecosistema Python/Django geralmente são muito bem documentadas. Entretanto, mesmo neste ambiente, sempre fica um "ranço" do "pessoal de TI" que insiste em escrever uma documentação com pouco ou nenhum exemplo e na maioria das vezes não se coloca na posição de quem vai usar. A própria documentação do Django é MUITO carente de exemplos apesar de ser muito detalhada.

Um outro exemplo de uma documentação que podia ser bem melhor é a biblioteca South. Raciocinem comigo: 99% das pessoas que vão começar a usá-la já tem um banco funcionando e sentem necessidade de utilizar o south para automatizar suas atualizações, concordam? Ou seja, quase ninguém que está começando a aprender a usar Django já vai de cara usar o south, concordam ?

Entretanto, a documentação do south parte do principio que você vai começar a usar de uma base vazia e não dá um passo a passo explícito de como fazer uma instalação em uma base já "populada". Até tem uma página especial explicando como usar uma base existente. Mas essa tinha que ser a primeira página, concordam??! Ou seja, cabeça de desenvolvedor :)

Assim, segue um pequeno tutorial para quem já tem uma base existente e quer utilizar o south sem susto:

1) Instalação:

    sudo easy_install south

2) Teste se a instalação foi bem sucedida realmente:

    python manage.py shell
    > import south

3) Entre no seu projeto e edite o settings.py, incluindo na lista INSTALLED_APPs, a string o 'south'

4) Crie a estrutura de dados do próprio south com

    python manage.py syncdb
5) Aqui está o pulo do gato:

  python manage.py schemamigration aplicacao --initial
  python manage.py migrate aplicacao 0001_initial --fake

6) Agora faça um teste simples, altere um modelo qualquer adicionando um campo booleano, por exemplo e veja a mágica do south funcionando:

  python manage.py schemamigration aplicacao --auto
  python manage.py migrate aplicacao

Este pequeno tutorial teve a valiosa colaboração e suporte do pessoal do Alatazan.


Ainda sobre documentação. Tem uma ótima exceção que vale a pena comentar: fiquei tão impressionado com a documentação e qualidade do django-admin-tools que fiz uma contribuição em dinheiro para o desenvolvedor. Como eu sempre digo, elogio é bom mas com dinheiro no bolso, ele fica mais sincero...

quinta-feira, 14 de abril de 2011

Gerando planilhas Excel no Django

Gestores e usuários adoram planilhas! Vocês já se perguntaram por que? Por um único motivo: liberdade! Com planilhas, o usuário fica livre do jugo do pessoal de TI e passa a ter o poder de manipular seus preciosos dados como bem entenderem, sem que um analista de sistema (nós) venha limitar o trabalho dele com questões arcanas tais como integridade, concorrência, etc.

Brincadeiras a parte, ao liberar os dados de seus sistemas utilizando o formato XML, você permite que seus usuários possam manipular o resultado de um relatório, agrupando os dados conforme suas necessidades, criando suas visões de dados, gráficos, etc sem depender de customizações do "pessoal de TI".

Para gerar planilhas no formato Excel, utilizei 2 bibliotecas: xlwt e django-excel-templates. A xlwt é a biblioteca de "baixo nível" que trata das minúcias e bits-e-bytes do formato XLS. Com ela é possível manipular cada elemento de uma célula, tais como fonte, borda, etc.

Já a biblioteca django-excel-templates tenta abstrair alguns detalhes da planilha, se preocupando em listar o conteúdo de um QuerySet do django. Antes de vermos a instalação, segue um exemplo de utilização do django-excel-templates:

from django_excel_templates import *
from django_excel_templates.color_converter import *
from models import *
from django.http import HttpResponse


def exemplo_excel(request):



   planilha = ExcelReport() 
   planilha.addSheet("Plano 1")
   dataset = Aluno.objects.all()
   headerstyle = ExcelStyle(font_color='FFFFFF',bold=True,pattern_color='000080',pattern=1)

   mediumFormatter = ExcelFormatter()
   mediumFormatter.addHeaderStyle(headerstyle)
   planilha.addFormatter(mediumFormatter)
  
planilha.addQuerySet(dataset,REPORT_HORZ,True)
   response = HttpResponse(planilha.writeReport(),mimetype='application/ms-excel')
   response['Content-Disposition'] = 'attachment; filename=teste.xls'
   return response


Ou seja, com poucas linhas, você disponibiliza uma planilha diretamente no browser sem a necessidade de arquivos temporários ou artifícios semelhantes.

Entretanto, nem tudo é uma maravilha: existem limitações nas bibliotecas que impedem vôos mais altos na manipulação de planilhas, tais como iniciar a carga a partir de uma planilha já existente e incluir figuras. Bem, acredito que são limitações pois até agora não consegui fazer, nem achei no código onde isso fique claro.

Nos próximos posts, vou tentar listar as experiências que estou fazendo com as duas bibliotecas com o Django, como integrar com Admin e como fazer consultas complexas retornando um ValueSet.

quarta-feira, 2 de março de 2011

Django 1.2 no Ubuntu de forma rápida

Muitos desenvolvedores utilizam o Django com o Ubuntu pois a instalação é feita com uma única linha de comando. Entretanto, esta instalação super rápida tem seus incovenientes já que as atualizações dos repositórios não seguem (ou não podem seguir) a mesma velocidade da equipe do Django.

Hoje precisei instalar o Django 1.2 para efetuar testes com o aplicativo django-helpdesk e encontrei uma dica muito boa para fazer o upgrade para o Django 1.2 em qualquer versão do Ubuntu.

1) Caso você ainda não tenha o Django instalado, instale através de: sudo apt-get install python-django

2) Instale o easy_install: sudo apt-get -y install python-setuptools

3) Agora que você já tem todas as dependências necessárias, remova o django padrão e instale o mais atual.

sudo apt-get remove python-django
cd /usr/lib
sudo easy_install -Z django

Para testar se tudo funcionou corretamente:

python
>import django
>django.VERSION

Para finalizar: onde ficam os fontes do Django agora ?

/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/

Fonte: django user google usergroup

Apresentação

Estou aprendendo e experimentando o Django aproximadamente a um ano. Infelizmente, devido aos afazeres com outras linguagens (Delphi e Oracle PL/SQL), não pude me dedicar até o momento com o afinco necessário. Mas a partir de Março, vou passar a 2a marcha e não largo mais o pé do acelerador.

Assim, achei importante dividir com a comunidade as minhas experiências com Django e Python. Como ainda sou aprendiz neste framework, acho que minhas descobertas e dicas serão bemvindas para os novatos como eu.