Django

45
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]

description

 

Transcript of Django

Page 1: Django

O framework web para perfeccionistas com prazosDjango facilita o desenvolvimento de aplicações web com mais qualidade e menos código

Alexandre D. RogoskiExata T.I.

[email protected]

Page 2: Django

Quem sou eu?

● Desenvolvedor Python;● Administrador de Sistemas/Redes;● Embaixador da Comunidade openSUSE;● Contribuidor openSUSE/Novell.

Page 3: Django

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.

Page 4: Django

O que é Django?

● “Django é um framework Python de alto-nível que estimula o desenvolvimento rápido e limpo, com 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 problemas comuns do desenvolvimento Web e oferece atalhos para tarefas de progração frequentes;

● DRY – Don't Repeat Yourself.

Page 5: Django

“... 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.

Page 6: Django

“... 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.

Page 7: Django

“... 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.

Page 8: Django

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.

Page 9: Django

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>

Page 10: Django

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.

Page 11: Django

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.

Page 12: Django

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 nesse componente para lidar com solicitações HTTP.

Page 13: Django

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.

Page 14: Django

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.

Page 15: Django

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

Page 16: Django

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.

Page 17: Django

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!

Page 18: Django

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 randomfrom 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    return HttpResponse(html)

Page 19: Django

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'),)

Page 20: Django

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.

Page 21: Django

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),

)

Page 22: Django

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.

Page 23: Django

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.

Page 24: Django

Primeiro Código Web

urls.py:

from django.conf.urls.defaults import *

urlpatterns = patterns('',  (r'^random_number/$', 'randomness.views.random_number'),)

views.py:

import randomfrom 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    return HttpResponse(html)

Page 25: Django

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).

Page 26: Django

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.

Page 27: Django

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.

Page 28: Django

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)

Page 29: Django

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.

Page 30: Django

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)

Page 31: Django

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))

Page 32: Django

O Admin Mumbo Jumbo

● Django Admin Site!!!

Page 33: Django

O Sistema

Temos modelos, agora precisamos de views, URLconf e alguns templates.

Aprendendo sobre templates rapidamente...

Page 34: Django

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, ...

Page 35: Django

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>

Page 36: Django

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.

Page 37: Django

Nosso Sistema

Agora podemos concluir nosso sistema.

Page 38: Django

As Views

views.py:

from django.http import HttpResponse, Http404from 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')    return HttpResponse(t.render(c))

Page 39: Django

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')),)

Page 40: Django

Os Templates

base.html:<html>  <head>    <title>{% block title %}Título{% endblock %}</title>  </head>  <body>{% block body %}Corpo{% endblock %}</body></html>

Page 41: Django

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 %}

Page 42: Django

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>{% endblock %}

Page 43: Django

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.

Page 44: Django

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] django-

[email protected]

Page 45: Django

Perguntas?

● Obrigado a todos!