django para desenvolvimento web; porque ser repetitivo é chato

78
Django para desenvolvimento web Porque ser repetitivo ´ e chato. Arthur Furlan (afurlan) [email protected] 11 de Maio de 2010 Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Upload: arthur-furlan

Post on 10-May-2015

4.466 views

Category:

Technology


0 download

DESCRIPTION

Apresenta algumas das principais características do Django. Mostra os conceitos por trás do framework e ilusta como o desenvolvedor consegue utilizar suas funcionalidades para produzir código mais rápido porém sem abrir mão da qualidade.

TRANSCRIPT

Django para desenvolvimento webPorque ser repetitivo e chato.

Arthur Furlan (afurlan)[email protected]

11 de Maio de 2010

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

”Django focuses on automating as much aspossible and adhering to the DRY principle.”

Django Project - http://djangoproject.com

Mais sobre o Django

Framework web voltado ao desenvolvimento agil

Torna facil e rapido tarefas simples do desenvolvimento web

Escrito com a linguagem de programacao Python

Django Reinhardt

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Mais sobre o Django

Framework web voltado ao desenvolvimento agil

Torna facil e rapido tarefas simples do desenvolvimento web

Escrito com a linguagem de programacao Python

Django Reinhardt

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Mais sobre o Django

Framework web voltado ao desenvolvimento agil

Torna facil e rapido tarefas simples do desenvolvimento web

Escrito com a linguagem de programacao Python

Django Reinhardt

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Mais sobre o Django

Framework web voltado ao desenvolvimento agil

Torna facil e rapido tarefas simples do desenvolvimento web

Escrito com a linguagem de programacao Python

Django Reinhardt

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Mais sobre o Django

Framework web voltado ao desenvolvimento agil

Torna facil e rapido tarefas simples do desenvolvimento web

Escrito com a linguagem de programacao Python

Django Reinhardt

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Principais caracterısticas

Desenvolvimento em Camadas (MVC)

Mapeamento Objeto Relacional (ORM)

Desenvolvimento dirigido a testes (TDD)

Interface administrativa

Sistema de templates

Mapeamento flexıvel de URLs

Sistema de cache

Internacionalizacao

Reusabilidade (DRY)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

O padrao MVC no Django

MVC X MTV

Model (Model)

Template (View)

View (Controller)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

O padrao MVC no Django

MVC X MTV

Model (Model)

Template (View)

View (Controller)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

O padrao MVC no Django

MVC X MTV

Model (Model)

Template (View)

View (Controller)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Projetos e aplicacoes

Sistemas em Django sao divididos em projetos e aplicacoes

Um projeto pode conter varias aplicacoes

Uma aplicacao pode fazer parte de varios projetos

O que e um projeto Django?

Uma instancia de Django: configuracoes, aplicacoes, etc.

O que e uma aplicacao Django?

Qualquer trecho de codigo que possa ser reutilizado

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Projetos e aplicacoes

Sistemas em Django sao divididos em projetos e aplicacoes

Um projeto pode conter varias aplicacoes

Uma aplicacao pode fazer parte de varios projetos

O que e um projeto Django?

Uma instancia de Django: configuracoes, aplicacoes, etc.

O que e uma aplicacao Django?

Qualquer trecho de codigo que possa ser reutilizado

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Projetos e aplicacoes

Sistemas em Django sao divididos em projetos e aplicacoes

Um projeto pode conter varias aplicacoes

Uma aplicacao pode fazer parte de varios projetos

O que e um projeto Django?

Uma instancia de Django: configuracoes, aplicacoes, etc.

O que e uma aplicacao Django?

Qualquer trecho de codigo que possa ser reutilizado

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Projetos e aplicacoes

Sistemas em Django sao divididos em projetos e aplicacoes

Um projeto pode conter varias aplicacoes

Uma aplicacao pode fazer parte de varios projetos

O que e um projeto Django?

Uma instancia de Django: configuracoes, aplicacoes, etc.

O que e uma aplicacao Django?

Qualquer trecho de codigo que possa ser reutilizado

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Projetos e aplicacoes

Sistemas em Django sao divididos em projetos e aplicacoes

Um projeto pode conter varias aplicacoes

Uma aplicacao pode fazer parte de varios projetos

O que e um projeto Django?

Uma instancia de Django: configuracoes, aplicacoes, etc.

O que e uma aplicacao Django?

Qualquer trecho de codigo que possa ser reutilizado

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Projetos e aplicacoes

Sistemas em Django sao divididos em projetos e aplicacoes

Um projeto pode conter varias aplicacoes

Uma aplicacao pode fazer parte de varios projetos

O que e um projeto Django?

Uma instancia de Django: configuracoes, aplicacoes, etc.

O que e uma aplicacao Django?

Qualquer trecho de codigo que possa ser reutilizado

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Entao o Django me ajuda a ser menos repetitivo... Ok, como?

O Django e um framework database-driven

Voce define suas regras de negocio no modelo

Camadas superiores herdam essas informacoes

AtributosInformacoesValidacoes

Entao o Django me ajuda a ser menos repetitivo... Ok, como?

O Django e um framework database-driven

Voce define suas regras de negocio no modelo

Camadas superiores herdam essas informacoes

AtributosInformacoesValidacoes

Entao o Django me ajuda a ser menos repetitivo... Ok, como?

O Django e um framework database-driven

Voce define suas regras de negocio no modelo

Camadas superiores herdam essas informacoes

AtributosInformacoesValidacoes

Entao o Django me ajuda a ser menos repetitivo... Ok, como?

O Django e um framework database-driven

Voce define suas regras de negocio no modelo

Camadas superiores herdam essas informacoes

AtributosInformacoesValidacoes

Entao o Django me ajuda a ser menos repetitivo... Ok, como?

O Django e um framework database-driven

Voce define suas regras de negocio no modelo

Camadas superiores herdam essas informacoes

Atributos

InformacoesValidacoes

Entao o Django me ajuda a ser menos repetitivo... Ok, como?

O Django e um framework database-driven

Voce define suas regras de negocio no modelo

Camadas superiores herdam essas informacoes

AtributosInformacoes

Validacoes

Entao o Django me ajuda a ser menos repetitivo... Ok, como?

O Django e um framework database-driven

Voce define suas regras de negocio no modelo

Camadas superiores herdam essas informacoes

AtributosInformacoesValidacoes

”Talk is cheap, show me the code!”

Criando um novo projeto

Um Catalogo de Contatos:

$ django-admin startproject catalogo

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando um novo projeto

Um Catalogo de Contatos:

$ django-admin startproject catalogo

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Comecando pelo comeco...

Configurando e criando o banco de dados:

$ vim settings.py

...DATABASE_ENGINE = ’postgresql_psycopg2 ’DATABASE_NAME = ’catalogo ’DATABASE_USER = ’catalogo ’DATABASE_PASSWORD = ’****** ’DATABASE_HOST = ’’DATABASE_PORT = ’’...

$ ./manage.py syncdb

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Comecando pelo comeco...

Configurando e criando o banco de dados:

$ vim settings.py

...DATABASE_ENGINE = ’postgresql_psycopg2 ’DATABASE_NAME = ’catalogo ’DATABASE_USER = ’catalogo ’DATABASE_PASSWORD = ’****** ’DATABASE_HOST = ’’DATABASE_PORT = ’’...

$ ./manage.py syncdb

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Digam ”Ola” para o Django!

Acessando o sistema:

$ ./manage.py runserver

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Digam ”Ola” para o Django!

Acessando o sistema:

$ ./manage.py runserver

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando uma aplicacao

Nossa primeira (e, nesta apresentacao, unica) aplicacao:

$ django-admin startapp contatos

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando uma aplicacao

Nossa primeira (e, nesta apresentacao, unica) aplicacao:

$ django-admin startapp contatos

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando um novo modelo

Criando o primeiro modelo da aplicacao

1 from django.db import models

2 from django.core.urlresolvers import reverse

34 class Pessoa(models.Model):

5 name = models.CharField(max_length =60)

6 email = models.EmailField(unique=True)

78 def __unicode__(self):

9 return ’"%s" <%s>’ % (self.name , self.email)

1011 def get_absolute_url(self):

12 return reverse(’pessoa -view’, args=[self.id])

Criando o formulario para o modelo Pessoa

1 from django.forms import ModelForm

2 from catalogo.apps.contatos.models import Pessoa

34 class PessoaForm(ModelForm ):

5 class Meta:

6 model = Pessoa

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando um novo modelo

Criando o primeiro modelo da aplicacao

1 from django.db import models

2 from django.core.urlresolvers import reverse

34 class Pessoa(models.Model):

5 name = models.CharField(max_length =60)

6 email = models.EmailField(unique=True)

78 def __unicode__(self):

9 return ’"%s" <%s>’ % (self.name , self.email)

1011 def get_absolute_url(self):

12 return reverse(’pessoa -view’, args=[self.id])

Criando o formulario para o modelo Pessoa

1 from django.forms import ModelForm

2 from catalogo.apps.contatos.models import Pessoa

34 class PessoaForm(ModelForm ):

5 class Meta:

6 model = Pessoa

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a primeira view

Listagem dos objetos

from django.shortcuts import render_to_response

from django.template import RequestContext

from catalogo.apps.contatos.models import Pessoa

def pessoa_list(request ):

# obtem a lista de pessoas

object_list = Pessoa.objects.all()

# envia os dados para o template

return render_to_response(’pessoa_list.html’, locals(),

context_instance=RequestContext(request ))

Template

{% extends "base.html" %}

{% block title %} Pessoas {% endblock %}

{% block body %}

<a href="{% url pessoa -insert %}">Inserir </a><br />

<br />

{% for object in object_list %}

<a href="{{ object.get_absolute_url }}">{{ object }}</a>

(<a href="{% url pessoa -update object.id %}">Editar </a>

|<a href="{% url pessoa -delete object.id %}">Apagar </a>)<br />

{% endfor %}

{% endblock %}

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a primeira view

Listagem dos objetos

from django.shortcuts import render_to_response

from django.template import RequestContext

from catalogo.apps.contatos.models import Pessoa

def pessoa_list(request ):

# obtem a lista de pessoas

object_list = Pessoa.objects.all()

# envia os dados para o template

return render_to_response(’pessoa_list.html’, locals(),

context_instance=RequestContext(request ))

Template

{% extends "base.html" %}

{% block title %} Pessoas {% endblock %}

{% block body %}

<a href="{% url pessoa -insert %}">Inserir </a><br />

<br />

{% for object in object_list %}

<a href="{{ object.get_absolute_url }}">{{ object }}</a>

(<a href="{% url pessoa -update object.id %}">Editar </a>

|<a href="{% url pessoa -delete object.id %}">Apagar </a>)<br />

{% endfor %}

{% endblock %}

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a segunda view

Exibicao dos objetos

from django.shortcuts import render_to_response , get_object_or_404

from django.template import RequestContext

from catalogo.apps.contatos.models import Pessoa

def pessoa_view(request , object_id ):

# obtem a pessoa a ser exibida

object = get_object_or_404(Pessoa , id=object_id)

# envia os dados para o template

return render_to_response(’pessoa_view.html’, locals(),

context_instance=RequestContext(request ))

Template

{% extends "base.html" %}

{% block title %} Exibir pessoa {% endblock %}

{% block body %}

<b>Nome:</b> {{ object.name }}<br />

<b>Email:</b> {{ object.email }}<br />

<br />

<a href="{% url pessoa -list %}">Voltar </a>

{% endblock %}

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a segunda view

Exibicao dos objetos

from django.shortcuts import render_to_response , get_object_or_404

from django.template import RequestContext

from catalogo.apps.contatos.models import Pessoa

def pessoa_view(request , object_id ):

# obtem a pessoa a ser exibida

object = get_object_or_404(Pessoa , id=object_id)

# envia os dados para o template

return render_to_response(’pessoa_view.html’, locals(),

context_instance=RequestContext(request ))

Template

{% extends "base.html" %}

{% block title %} Exibir pessoa {% endblock %}

{% block body %}

<b>Nome:</b> {{ object.name }}<br />

<b>Email:</b> {{ object.email }}<br />

<br />

<a href="{% url pessoa -list %}">Voltar </a>

{% endblock %}

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a terceira view

Removendo objetos

from django.shortcuts import get_object_or_404

from django.http import HttpResponseRedirect

from catalogo.apps.contatos.models import Pessoa

def pessoa_delete(request , object_id ):

# obtem a pessoa a ser apagadao

object = get_object_or_404(Pessoa , id=object_id)

object.delete ()

# redireciona para a listagem de objetos

return HttpResponseRedirect(reverse(’pessoa -list’))

Template: nao tem

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a terceira view

Removendo objetos

from django.shortcuts import get_object_or_404

from django.http import HttpResponseRedirect

from catalogo.apps.contatos.models import Pessoa

def pessoa_delete(request , object_id ):

# obtem a pessoa a ser apagadao

object = get_object_or_404(Pessoa , id=object_id)

object.delete ()

# redireciona para a listagem de objetos

return HttpResponseRedirect(reverse(’pessoa -list’))

Template: nao tem

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a ultima view

Edicao de objetos

from django.core.urlresolvers import reverse

from django.shortcuts import render_to_response , get_object_or_404

from django.template import RequestContext

from django.http import HttpResponseRedirect

from catalogo.apps.contatos.models import Pessoa

from catalogo.apps.contatos.forms import PessoaForm

def pessoa_form(request , object_id=None):

# carrega o objeto (se houver) e inicializa o formulario

instance = get_object_or_404(Pessoa , id=object_id) if object_id else None

form = PessoaForm(instance=instance)

# valida e altera o objeto (caso a validacao esteja OK)

if request.method == ’POST’:

form = PessoaForm(request.POST , instance=instance)

if form.is_valid ():

form.save()

return HttpResponseRedirect(reverse(’pessoa -list’))

# envia novamente para o formulario

return render_to_response(’pessoa_form.html’, locals(),

context_instance=RequestContext(request ))

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Criando a ultima view

Template

{% extends "base.html" %}

{% block title %}

{% if form.instance.id %} Editar {% else %} Inserir {% endif %} pessoa

{% endblock %}

{% block body %}

<form method="post" action=".">

{{ form.as_p }}

<input type="submit" value="Enviar" />

</form>

{% endblock %}

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Mapeando URLs para as views

URLs do projeto

1 from django.conf.urls.defaults import *

23 urlpatterns = patterns(’’,

4 url(’^pessoa/’, include(’catalogo.apps.contatos.urls’)),

5 )

URLs da aplicacao

1 from django.conf.urls.defaults import *

23 urlpatterns = patterns(’catalogo.apps.contatos ’,

4 url(’^$’, ’views.pessoa_list ’, name=’pessoa -list’),

5 url(’^form/$’, ’views.pessoa_form ’, name=’pessoa -insert ’),

6 url(’^form /(?P<object_id >\d+)/$’, ’views.pessoa_form ’,

7 name=’pessoa -update ’),

8 url(’^view /(?P<object_id >\d+)/$’, ’views.pessoa_view ’,

9 name=’pessoa -view’),

10 url(’^delete /(?P<object_id >\d+)/$’, ’views.pessoa_delete ’,

11 name=’pessoa -delete ’),

12 )

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Mapeando URLs para as views

URLs do projeto

1 from django.conf.urls.defaults import *

23 urlpatterns = patterns(’’,

4 url(’^pessoa/’, include(’catalogo.apps.contatos.urls’)),

5 )

URLs da aplicacao

1 from django.conf.urls.defaults import *

23 urlpatterns = patterns(’catalogo.apps.contatos ’,

4 url(’^$’, ’views.pessoa_list ’, name=’pessoa -list’),

5 url(’^form/$’, ’views.pessoa_form ’, name=’pessoa -insert ’),

6 url(’^form /(?P<object_id >\d+)/$’, ’views.pessoa_form ’,

7 name=’pessoa -update ’),

8 url(’^view /(?P<object_id >\d+)/$’, ’views.pessoa_view ’,

9 name=’pessoa -view’),

10 url(’^delete /(?P<object_id >\d+)/$’, ’views.pessoa_delete ’,

11 name=’pessoa -delete ’),

12 )

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Reaproveitando mais, escrevendo menos...

Se eu quiser criar outro modelo, qual a diferenca?

O modelo

Por que nao criar algo generico?

Generic Views!

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Reaproveitando mais, escrevendo menos...

Se eu quiser criar outro modelo, qual a diferenca? O modelo

Por que nao criar algo generico?

Generic Views!

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Reaproveitando mais, escrevendo menos...

Se eu quiser criar outro modelo, qual a diferenca? O modelo

Por que nao criar algo generico?

Generic Views!

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Reaproveitando mais, escrevendo menos...

Se eu quiser criar outro modelo, qual a diferenca? O modelo

Por que nao criar algo generico?

Generic Views!

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Mapeando URLs para as views... com Generic Views

Mapeamento de URLs utilizando Generic Views

from django.conf.urls.defaults import *

from django.views.generic import create_update , list_detail

from models import Pessoa

list_dict_info = { ’queryset ’:Pessoa.objects.all(), ’template_name ’:’pessoa_list.html’ }

view_dict_info = { ’queryset ’:Pessoa.objects.all(), ’template_name ’:’pessoa_view.html’ }

insert_dict_info = {

’model’:Pessoa , ’post_save_redirect ’:’/pessoa/’,

’template_name ’:’pessoa_form.html’,

}

delete_dict_info = { ’model ’:Pessoa , ’post_delete_redirect ’:’/pessoa/’ }

update_dict_info = insert_dict_info

urlpatterns = patterns(’’,

url(’^$’, list_detail.object_list , list_dict_info , name=’pessoa -list’),

url(’^form/$’, create_update.create_object ,

insert_dict_info , name=’pessoa -insert ’),

url(’^form /(?P<object_id >\d+)/$’, create_update.update_object ,

update_dict_info , name=’pessoa -update ’),

url(’^view /(?P<object_id >\d+)/$’, list_detail.object_detail ,

view_dict_info , name=’pessoa -view’),

url(’^delete /(?P<object_id >\d+)/$’, create_update.delete_object ,

delete_dict_info , name=’pessoa -delete ’),

)

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Telas da aplicacao

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

Administracao

FlatpagesSitemapsFeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpages

SitemapsFeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemaps

FeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeeds

AutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeedsAutenticacao

Cache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeedsAutenticacaoCache

...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.org

http://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Isso e so a ponta do iceberg...

O Django tem muitas outras coisas interessantes:

AdministracaoFlatpagesSitemapsFeedsAutenticacaoCache...

Repositorios de aplicacoes

http://djangoapps.orghttp://pinaxproject.com

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web

Fim

Obrigado! Duvidas?

http://www.slideshare.net/afurlan/django-para-desenvolvimento-web-porque-ser-repetitivo-chato

http://tinyurl.com/afurlan-django

Arthur Furlan (afurlan)[email protected]

http://blog.afurlan.org

twitter: @arthurfurlan

Arthur Furlan (afurlan) [email protected] Django para desenvolvimento web