O framework web para perfeccionistas com prazos
O framework web para perfeccionistas com prazos
Django facilita o desenvolvimento de aplicações web com mais
Django facilita o desenvolvimento de aplicações web com mais
qualidade e menos código
qualidade e menos código
Alexandre D. Rogoski Alexandre D. Rogoski Exata T.I. Exata T.I. alexandre@exatati.com.br alexandre@exatati.com.br
Quem sou eu?
Quem sou eu?
●
● Desenvolvedor Python;Desenvolvedor Python;
●
● Administrador de Administrador de Sistemas/RSistemas/Redes;edes;
●
● Embaixador da Comunidade openSUSE;Embaixador da Comunidade openSUSE;
●
Python
Python
●
● Linguagem de programação de alto-nível;Linguagem de programação de alto-nível;
●
● Interpretada, interativa e orientada a objetos;Interpretada, interativa e orientada a objetos;
●
● TTipagem forte ipagem forte e dinâmica;e dinâmica;
●
O que é Django?
O que é Django?
●● “Django é um framework Python de alto-nível que“Django é um framework Python de alto-nível que
estimula o desenvolvimento rápido e limpo, c
estimula o desenvolvimento rápido e limpo, comom
design objetivo e realista.”
design objetivo e realista.”
●
● Um framework Web de alto-nível é um softwareUm framework Web de alto-nível é um software
que facilita e torna menos doloroso o processo de
que facilita e torna menos doloroso o processo de
construção de
construção de sites dinâmicos. Asites dinâmicos. Abstrai problemasbstrai problemas
comuns do desenvolvimento Web e oferece
comuns do desenvolvimento Web e oferece
atalhos para tarefas de progração frequentes;
atalhos para tarefas de progração frequentes;
●
“... 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
“... 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;
Abordagem Não-Tão-Limpa
<html> <head><title>Meus Amiguinhos</title></head> <body> <h1>Meus Amigos</h1> <ul> <?php$connection = @mysql_connect("localhost", "my_username", "my_pass");
mysql_select_db("my_database");
$people = mysql_query("SELECT name, age FROM friends");
while ( $person = mysql_fetch_array($people, MYSQL_ASSOC) ) { ?>
<li>
<?php echo $person['name'] ?> tem <?php echo $person['age'] ?> anos de idade. </li> <?php } ?> </ul> </body> </html>
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 encaixam-se nesencaixam-se 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
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 = '<html><body><p>Seu número da sorte é: %u</p></body></html>' % x
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
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
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 = '<html><body><p>Seu número da sorte é:
%u</p></body></html>' % x
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
Modelos
● Definição explícita no código, sem
introspecção em tempo de execução:
● Desempenho;
● Metadados Ricos;
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
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):
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):
O Admin Mumbo Jumbo
O Sistema
Temos modelos, agora precisamos de views,
URLconf e alguns templates.
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:
e-mails, 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
<html>
<head><title>{{ book }}</title></head> <body> <h1>{{ book }}</h1> <p>Este é um livro:</p> <table> <tr><th>Título:</th><td>{{ book.title }}</td></tr> <tr><th>Autor:</th><td>{{ book.author }}</td></tr> </table> </body> </html>
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
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 })
O URLConf
urls.py:from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^books/$', 'mybooks.books.views.book_list'), (r'^books/(?P<id>[0-9]+)/$', 'mybooks.books.views.book_detail'), (r'^admin/', include('django.contrib.admin.urls')), )
Os Templates
base.html:
<html> <head>
<title>{% block title %}Título{% endblock %}</title> </head>
<body>{% block body %}Corpo{% endblock %}</body> </html>
Os Templates
book_list.html:
{% extends "base.html" %}
{% block title %}Meus Livros{% endblock %} {% block body %}
{% if books %}
<p>Estes são alguns dos livros da minha coleção:</p>
<ul>
{% for book in books %}
<li><a href="{{ book.id }}">{{ book }}</a></li> {% endfor %}
</ul>
{% else %}
<p>Eu não tenho uma coleção de livros!</p>
{% endif %} {% endblock %}
Os Templates
book_detail.html:
{% extends "base.html" %}
{% block title %}{{ book }}{% endblock %} {% block body %}
<p>Este é um dos meus livros:</p> <table> <tr> <th>Título:</th> <td>{{ book.title }}</td> </tr> <tr> <th>Autor:</th> <td>{{ book.author }}</td> </tr> </table>
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
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: users@googlegroups.com