O framework web para perfeccionistas com prazos Django facilita o desenvolvimento de aplicações web com mais qualidade e menos código
Alexandre D. Rogoski Exata T.I.
[email protected]
Quem sou eu?
●
●
●
●
Desenvolvedor Python; Administrador de Sistemas/R Sistemas/Redes; edes; Embaixador da Comunidade openSUSE; Contribuidor openSUSE/Novell.
Python
●
●
●
●
Linguagem de programação de alto-nível; Interpretada, interativa e orientada a objetos; Tipagem forte e dinâmica; Identação obrigatória = código legível.
O que é Django? ●
●
●
“Django é um framework Python de alto-nível que estimula o desenvolvimento rápido e limpo, com c om design objetivo e realista.” Um framework Web de alto-nível é um software que facilita e torna menos doloroso o processo de construção de sites dinâmicos. Abstrai Abstrai problemas comuns do desenvolvimento Web e oferece atalhos para tarefas de progração frequentes; DRY – Don't Repeat Yourself.
“... um framework Python de alto-nível ...”
●
●
●
●
●
●
Um framework deve abordar questões comuns como: Prover um método de mapeamento entre as URLs solicitadas e o código que manipula as requisições; Tornar mais fácil a exibição, validação e reexibição de formulários HTML; Converter a entrada do usuário em tipos de dados que podem ser manipulados convenientemente; Separar o conteúdo da apresentação através de um sistema de templates; Integrar-se com camadas de armazenamento; Permitir que você trabalhe de forma mais produtiva, em um nível maior de abstração.
“... que estimula o desenvolvimento rápido ...”
●
Independentemente de quantos poderosos recursos ele tenha, um framework Web é inútil se não lhe poupar tempo. A produtividade do Django é em grande parte graças aos benefícios do Python: Linguagem interpretada; Tipada dinamicamente; Concisa mas expressiva; Introspecção poderosa e meta-programação. Django aproveita as vantagens proporcionadas pelo Python para acelerar o desenvolvimento de aplicações web. ●
●
●
●
●
“... e limpo, com design objetivo e realista.”
●
●
Acima de tudo, Django tenta: Tornar mais fácil fazer as coisas do jeito “certo”; Incentivar fraco acoplamento.
História ●
●
●
●
●
Batizado com o nome de “Django Reinhardt”; Desenvolvido por Adrian Holovaty e Jacob Kaplan-Moss no World Online News; Declarado OpenSource em 2005; Primeira versão lançada em 3 de setembro de 2008; Sua pronúncia é JANG-oh. Com D mudo.
Abordagem Não-Tão-Limpa Meus Amiguinhos Meus Amigos tem anos de idade.
Abordagem Não-Tão-Limpa ●
Quais são os problemas dessa abordagem? ●
●
●
●
●
A apresentação está vinculada ao código; O código do banco de dados está vinculado à lógica de negócios; A URL é acoplada ao código (determina o nome do arquivo a ser exibido; Parâmetros do banco de dados hard-coded ; Nível muito-baixo. Para aplicações de grande porte a complexidade escalona-se surpreendentemente.
Arquitetura do Framework ●
Django é um framework MVC, interpretado de forma livre. Componentes Principais:
●
●
●
Core (Framework HTTP); Mapeador Objeto-Relacional (ORM); Template Engine; Lembre-se, os componentes do Django são fracamente acoplados, de modo que cada peça pode ser usada separadamente ou substituída por um equivalente de terceiros.
Arquitetura do Framework: Core O Core proporciona: ●
●
●
Mecanismo padronizado para tratamento de requisições HTTP; Máquina de mapeamento URL; Integração do servidor de Web com múltiplos backends (Apache + mod_python, FastCGI, ...); Aplicativos Web construídos com Django encaixamse nesse componente para lidar com solicitações HTTP.
Projetos e Aplicações Como os sitemas em Django são organizados? ●
●
●
●
Cada sistema é composto por uma ou mais aplicações; Aplicações são agrupadas em um “projeto”, embora não seja obrigatório. Projetos são uma forma de representação amigável; Cada site usa um único arquivo de configurações, normalmente chamado settings.py , que diz ao Django que aplicativos usar e como usá-los; O arquivo de configuração também tem uma grande variedade de configurações do sistema.
O que é uma aplicação? ●
●
●
●
Possui views para lidar com solicitações HTTP; URLconf's para mapear solicitações de URL em views; Modelos para fácil integração ao banco de dados; Templates para simplificar geração de código HTML e porporcionar isolamento entre apresentação e lógica de negócios.
django-admin.py Django fornece uma ferramenta de linha de comando simples que, entre outras coisas, torna mais fácil criar os esqueletos de projeto e aplicação. Por exemplo, para criar um novo projeto: $ django-admin.py startproject exemplo $ cd exemplo && ls __init__.py manage.py settings.py urls.py
manage.py manage.py é ●
●
um utilitário que vem com o esqueleto de projeto padrão. Envolve grande parte da mesma funcionalidade do django-admin.py , mas assume que você está interessado no projeto do diretório atual. Este é apenas um atalho para o projeto ao qual pretende trabalhar, para não ter que ser especificado em cada comando.
Primeiros Passos
●
●
●
●
Django torna mais fácil ter um servidor de desenvolvimento iniciado e executando. Simples de usar, zero de configuração; Thread única, processo único; Fornece relatório de erro verbose (e muito!). Não é para uso em produção!
Views O que são views? ●
●
●
Views são simplesmente funções Python; Views têm pelo menos um argumento, um objeto HttpRequest; Views devem ou retornar um objeto HttpResponse ou uma exceção apropriada. import random from django.http import HttpResponse def random_number(request): x = random.randint(0, 999) html = 'Seu n úmero da sorte é: %u' % x return HttpResponse(html)
URLconf's ●
●
Uma vez definida a view só precisamos dizer ao Django onde ela vive no espaço URL; Fazemos isso com um URLconf, geralmente chamado urls.py. from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^random_number/$', 'randomness.views.random_number'), )
Como URLConf's funcionam? Django URL dispatcher é responsável por ler o URLconf e fazer algo de útil com ele: ●
●
●
●
Uma URLconf são pares de expressão regular com views; Quando uma solicitação é recebida, o URL dispatcher tenta corresponder cada expressão regular com a URL solicitada; As expressões regulares são julgados em ordem, de cima para baixo; Quando é encontrada uma regex que corresponde à URL solicitada, essa view é usada para processar a requisição.
Exemplo de URLConf
Uma requisição para /eventos/2006/: urlpatterns = patterns('', ('^$', views.homepage), ('^/sobre/$', views.sobre), ('^/eventos/$', views.cal_archive), ('^/eventos/(200\d)/$', views.cal_year), ('^/eventos/(200\d)/(\d\d)/$', views.cal_month), )
Mais sobre URLconf's Algumas coisas mais sobre URLconf: ●
●
●
Normalmente, cada aplicação contendo views possui sua URLconf (urls.py), e uma entrada no URLconf do projeto; URLconf's por aplicação podem ser usadas para manter as aplicações auto-contidas, então o URLconf do projeto pode incluir cada uma das URLconf's das aplicações; Mas apenas a URLconf do projeto é realmente necessária, ela pode mapear qualquer URL a uma view .
Primeira Configuração settings.py: ROOT_URLCONF = 'exemplo.urls' ●
Para alguns sistemas Django o arquivo de configurações será muito extenso. Mas para este exemplo, entretanto, é tão pequeno que requer apenas o ROOT_URLCONF.
Primeiro Código Web urls.py:
from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^random_number/$', 'randomness.views.random_number'), ) views.py:
import random from django.http import HttpResponse def random_number(request): x = random.randint(0, 999) html = 'Seu número da sorte é: %u' % x return HttpResponse(html)
Django ORM
●
No mundo Django, os modelos são a fonte oficial de todas as informações relacionadas com a arquitetura de banco de dados e de representação. Modelos reúnem: ●
●
Definição do esquema do banco de dados; Definição programática dos objetos (seu comportamento).
Modelos
●
Definição explícita no código, sem introspecção em tempo de execução: ●
●
●
Desempenho; Metadados Ricos; Agnóstico ao Banco de Dados.
Mais em Modelos O modelo para os modelos: ●
●
●
A classe model representa uma tabela do banco de dados; Cada instância de classe representa uma linha na tabela; Cada classe do modelo automaticamente recebe alguns atributos especiais para fornecer funcionalidade de banco de dados, como consultas.
Exemplo de Modelos
from django.db import models class Author(models.Model): firstname = models.CharField(max_length = 256) lastname = models.CharField(max_length = 256) class Book(models.Model): title = models.CharField(max_length = 256) author = models.ForeignKey(Author)
Inicializando o Banco de Dados
●
●
●
O banco de dados é automaticamente inicializado com o comando " manager.py syncdb". As tabelas necessárias para todos os aplicativos instalados são criadas; Os dados iniciais são inseridos, se os aplicativos possuirem algum; Hooks específicos dos aplicativos são inicializados.
Concretizando os Modelos
class Author(models.Model): firstname = models.CharField(max_length = 256, blank = False) lastname = models.CharField(max_length = 256, blank = False) class Meta: unique_together = ( ('firstname', 'lastname'), ) def __str__(self): return '%s %s' % (self.firstname, self.lastname)
Concretizando os Modelos
class Book(models.Model): title = models.CharField(max_length = 256, blank = False) author = models.ForeignKey(Author) class Meta: unique_together = ( ('title', 'author'), ) def __str__(self): return '%s by %s' % (self.title, str(self.author))
O Admin Mumbo Jumbo
●
Django Admin Site!!!
O Sistema
Temos modelos, agora precisamos de views, URLconf e alguns templates. Aprendendo sobre templates rapidamente...
Django Templates A engine de templates Django é similar em algumas maneiras à outras engines (e.x.: Smarty): ●
●
●
●
Uma linguagem simples para aplicar lógica de exibição à marcação. É extensível. Ele pode ser usado para mais do que apenas HTML: emails, as exportações CSV, JSON, XML, ... Solução “Out-of-the-box”, não tem habilidade para afetar o estado da aplicação, escrever no banco de dados, chamar funções Python diretamente, ...
Template Simples
{{ book }} {{ book }} Este é um livro: Título:{{ book.title }} Autor:{{ book.author }}
Como os templates funcionam? Princípios de renderização de templates: ●
●
●
●
Código Python (normalmente a função da view ) o faz processamento; O modelo é encontrado pelo nome e carregado; Um Contexto é criado; isto é uma coleção de objetos e variáveis que serão representadas no template; O Contexto é renderizado no template com uma única chamada de função.
Nosso Sistema
Agora podemos concluir nosso sistema.
As Views views.py:
from django.http import HttpResponse, Http404 from django.template import loader, Context from mybooks.books import models def book_list(request): books = models.Book.objects.all() c = Context({ 'books': books }) t = loader.get_template('book_list.html') return HttpResponse(t.render(c)) def book_detail(request, id): try: book = models.Book.objects.get(id = id) except models.Book.DoesNotExist: raise Http404 c = Context({ 'book': book }) t = loader.get_template('book_detail.html')
O URLConf urls.py: from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^books/$', 'mybooks.books.views.book_list'), (r'^books/(?P[0-9]+)/$', 'mybooks.books.views.book_detail'), (r'^admin/', include('django.contrib.admin.urls')), )
Os Templates
base.html: {% block title %}T ítulo{% endblock %} {% block body %}Corpo{% endblock %}
Os Templates book_list.html:
{% extends "base.html" %} {% block title %}Meus Livros{% endblock %} {% block body %} {% if books %} Estes são alguns dos livros da minha cole ção: {% for book in books %} {{ book }} {% endfor %} {% else %} Eu não tenho uma cole ção de livros! {% endif %} {% endblock %}
Os Templates book_detail.html:
{% extends "base.html" %} {% block title %}{{ book }}{% endblock %} {% block body %} Este é um dos meus livros: Título: {{ book.title }} Autor: {{ book.author }}
E Mais Isto foi apenas o básico, o Django cria muito mais recursos impressionantes que realmente maximizam sua produtividade: ●
●
●
●
Processamento de formulários, validação, Ajax, Unit Testing, sessões, cookies, CSRF, ...; Visões genéricas: O sistema poderia ter sido criado sem escrever uma única visão (e código HTML); Conectando aplicativos plugáveis de terceiros você consegue recursos sofisticados de graça! Django está em melhoria contínua e o conjunto de recursos continua a crescer.
Outros Recursos ●
●
●
●
●
●
●
●
●
http://www.djangoproject.com http://docs.djangoproject.com http://www.djangobrasil.org http://www.aprendendodjango.com.br http://www.djangobook.com http://djangoadvent.com http://www.python.org IRC: #django e #django-br ML:
[email protected] [email protected]