django: desenvolvendo aplicações web de maneira simples e rápida!

88
Django Desenvolvendo aplicações web de maneira simples e rápida! Felipe B. Queiroz [email protected] III Jornada Acadêmica de Informática - JAINF Novembro de 2010 1 / 42

Upload: felipe-queiroz

Post on 11-Jun-2015

3.609 views

Category:

Technology


20 download

DESCRIPTION

Minicurso ministrado na III Jornada Acadêmica de Informática - JAINF

TRANSCRIPT

Page 1: Django: desenvolvendo aplicações web de maneira simples e rápida!

DjangoDesenvolvendo aplicações web de maneira simples e rápida!

Felipe B. [email protected]

III Jornada Acadêmica de Informática - JAINF

Novembro de 2010

1 / 42

Page 2: Django: desenvolvendo aplicações web de maneira simples e rápida!

Quem sou eu?

Felipe Buarque (wally)

Mestrando pela UFPE

Entusiasta de software livre

Entusiasta da linguagem Python

Blog: www.felipewally.com.br

Twitter: @felipe_wally

2 / 42

Page 3: Django: desenvolvendo aplicações web de maneira simples e rápida!

Quem sou eu?

Felipe Buarque (wally)

Mestrando pela UFPE

Entusiasta de software livre

Entusiasta da linguagem Python

Blog: www.felipewally.com.br

Twitter: @felipe_wally

2 / 42

Page 4: Django: desenvolvendo aplicações web de maneira simples e rápida!

Quem sou eu?

Felipe Buarque (wally)

Mestrando pela UFPE

Entusiasta de software livre

Entusiasta da linguagem Python

Blog: www.felipewally.com.br

Twitter: @felipe_wally

2 / 42

Page 5: Django: desenvolvendo aplicações web de maneira simples e rápida!

Quem sou eu?

Felipe Buarque (wally)

Mestrando pela UFPE

Entusiasta de software livre

Entusiasta da linguagem Python

Blog: www.felipewally.com.br

Twitter: @felipe_wally

2 / 42

Page 6: Django: desenvolvendo aplicações web de maneira simples e rápida!

Quem sou eu?

Felipe Buarque (wally)

Mestrando pela UFPE

Entusiasta de software livre

Entusiasta da linguagem Python

Blog: www.felipewally.com.br

Twitter: @felipe_wally

2 / 42

Page 7: Django: desenvolvendo aplicações web de maneira simples e rápida!

Quem sou eu?

Felipe Buarque (wally)

Mestrando pela UFPE

Entusiasta de software livre

Entusiasta da linguagem Python

Blog: www.felipewally.com.br

Twitter: @felipe_wally

2 / 42

Page 8: Django: desenvolvendo aplicações web de maneira simples e rápida!

Alguém conhece Python?

3 / 42

Page 9: Django: desenvolvendo aplicações web de maneira simples e rápida!

Alguém NÃO conhece Python?

4 / 42

Page 10: Django: desenvolvendo aplicações web de maneira simples e rápida!

Um pouco de história...

Open Source script language

Guido Van Rossum (BDFL) - 1991

Monty Python’s Flying Circus

Ensino de programação

Simplicidade e fácil aprendizado

import this

5 / 42

Page 11: Django: desenvolvendo aplicações web de maneira simples e rápida!

Um pouco de história...

Open Source script language

Guido Van Rossum (BDFL) - 1991

Monty Python’s Flying Circus

Ensino de programação

Simplicidade e fácil aprendizado

import this

5 / 42

Page 12: Django: desenvolvendo aplicações web de maneira simples e rápida!

Um pouco de história...

Open Source script language

Guido Van Rossum (BDFL) - 1991

Monty Python’s Flying Circus

Ensino de programação

Simplicidade e fácil aprendizado

import this

5 / 42

Page 13: Django: desenvolvendo aplicações web de maneira simples e rápida!

Um pouco de história...

Open Source script language

Guido Van Rossum (BDFL) - 1991

Monty Python’s Flying Circus

Ensino de programação

Simplicidade e fácil aprendizado

import this

5 / 42

Page 14: Django: desenvolvendo aplicações web de maneira simples e rápida!

Um pouco de história...

Open Source script language

Guido Van Rossum (BDFL) - 1991

Monty Python’s Flying Circus

Ensino de programação

Simplicidade e fácil aprendizado

import this

5 / 42

Page 15: Django: desenvolvendo aplicações web de maneira simples e rápida!

Um pouco de história...

Open Source script language

Guido Van Rossum (BDFL) - 1991

Monty Python’s Flying Circus

Ensino de programação

Simplicidade e fácil aprendizado

import this

5 / 42

Page 16: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 17: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 18: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 19: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 20: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 21: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 22: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 23: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Interpretada (bytecode + VM)

Multiplataforma

Tipagem forte e dinâmica

OO + procedural + funcional

Extensa biblioteca padrão

Sintaxe elegante, simples e clara

Blocos de código são delimitados por identação

Interpretador interativo: Shell

6 / 42

Page 24: Django: desenvolvendo aplicações web de maneira simples e rápida!

Desenvolvimento

Web: Zope, Webware, TurboGears, Django ...

Banco de dados: DB-API, Oracle, MySQL, PostgreSQL,SQLite, MongoDB ...

GUI: Tkinter, wxPython, PyQT, PyGTK, PyFLTK ...

Rede: Sockets, ftp, http, smtp, Twisted ...

Webservices: XML-RPC, SOAP ...

Outros: Threads, Unicode, XML ...

7 / 42

Page 25: Django: desenvolvendo aplicações web de maneira simples e rápida!

Desenvolvimento

Web: Zope, Webware, TurboGears, Django ...

Banco de dados: DB-API, Oracle, MySQL, PostgreSQL,SQLite, MongoDB ...

GUI: Tkinter, wxPython, PyQT, PyGTK, PyFLTK ...

Rede: Sockets, ftp, http, smtp, Twisted ...

Webservices: XML-RPC, SOAP ...

Outros: Threads, Unicode, XML ...

7 / 42

Page 26: Django: desenvolvendo aplicações web de maneira simples e rápida!

Desenvolvimento

Web: Zope, Webware, TurboGears, Django ...

Banco de dados: DB-API, Oracle, MySQL, PostgreSQL,SQLite, MongoDB ...

GUI: Tkinter, wxPython, PyQT, PyGTK, PyFLTK ...

Rede: Sockets, ftp, http, smtp, Twisted ...

Webservices: XML-RPC, SOAP ...

Outros: Threads, Unicode, XML ...

7 / 42

Page 27: Django: desenvolvendo aplicações web de maneira simples e rápida!

Desenvolvimento

Web: Zope, Webware, TurboGears, Django ...

Banco de dados: DB-API, Oracle, MySQL, PostgreSQL,SQLite, MongoDB ...

GUI: Tkinter, wxPython, PyQT, PyGTK, PyFLTK ...

Rede: Sockets, ftp, http, smtp, Twisted ...

Webservices: XML-RPC, SOAP ...

Outros: Threads, Unicode, XML ...

7 / 42

Page 28: Django: desenvolvendo aplicações web de maneira simples e rápida!

Desenvolvimento

Web: Zope, Webware, TurboGears, Django ...

Banco de dados: DB-API, Oracle, MySQL, PostgreSQL,SQLite, MongoDB ...

GUI: Tkinter, wxPython, PyQT, PyGTK, PyFLTK ...

Rede: Sockets, ftp, http, smtp, Twisted ...

Webservices: XML-RPC, SOAP ...

Outros: Threads, Unicode, XML ...

7 / 42

Page 29: Django: desenvolvendo aplicações web de maneira simples e rápida!

Desenvolvimento

Web: Zope, Webware, TurboGears, Django ...

Banco de dados: DB-API, Oracle, MySQL, PostgreSQL,SQLite, MongoDB ...

GUI: Tkinter, wxPython, PyQT, PyGTK, PyFLTK ...

Rede: Sockets, ftp, http, smtp, Twisted ...

Webservices: XML-RPC, SOAP ...

Outros: Threads, Unicode, XML ...

7 / 42

Page 30: Django: desenvolvendo aplicações web de maneira simples e rápida!

Onde roda?

8 / 42

Page 31: Django: desenvolvendo aplicações web de maneira simples e rápida!

Frameworks web

9 / 42

Page 32: Django: desenvolvendo aplicações web de maneira simples e rápida!

Welcome to the Django!

10 / 42

Page 33: Django: desenvolvendo aplicações web de maneira simples e rápida!

O que é Django?!

“Django is a high-level Python Web framework that encourages

rapid development and clean, pragmatic design.”

(djangoproject.com)

“...and is not a CMS system.”

(wally)

11 / 42

Page 34: Django: desenvolvendo aplicações web de maneira simples e rápida!

Origens...

12 / 42

Page 35: Django: desenvolvendo aplicações web de maneira simples e rápida!

Origens...

13 / 42

Page 36: Django: desenvolvendo aplicações web de maneira simples e rápida!

Origens...

Criado por Adrian Holovaty - PyCon 2005

Criado para ser um gerenciador de notícias

Licença BSD 1

Mantido pela Django Software Foundation desde 2008

1http://en.wikipedia.org/wiki/BSD_licenses14 / 42

Page 37: Django: desenvolvendo aplicações web de maneira simples e rápida!

Origens...

Criado por Adrian Holovaty - PyCon 2005

Criado para ser um gerenciador de notícias

Licença BSD 1

Mantido pela Django Software Foundation desde 2008

1http://en.wikipedia.org/wiki/BSD_licenses14 / 42

Page 38: Django: desenvolvendo aplicações web de maneira simples e rápida!

Origens...

Criado por Adrian Holovaty - PyCon 2005

Criado para ser um gerenciador de notícias

Licença BSD 1

Mantido pela Django Software Foundation desde 2008

1http://en.wikipedia.org/wiki/BSD_licenses14 / 42

Page 39: Django: desenvolvendo aplicações web de maneira simples e rápida!

Origens...

Criado por Adrian Holovaty - PyCon 2005

Criado para ser um gerenciador de notícias

Licença BSD 1

Mantido pela Django Software Foundation desde 2008

1http://en.wikipedia.org/wiki/BSD_licenses14 / 42

Page 40: Django: desenvolvendo aplicações web de maneira simples e rápida!

djangoproject.com

15 / 42

Page 41: Django: desenvolvendo aplicações web de maneira simples e rápida!

Princípios (... ou filosofias)

DRY (Don’t Repeat Yourself)

Baixo acoplamento

Plugabilidade e reusabilidade

Escrever menos código possível

Desenvolvimento rápido!

16 / 42

Page 42: Django: desenvolvendo aplicações web de maneira simples e rápida!

Princípios (... ou filosofias)

DRY (Don’t Repeat Yourself)

Baixo acoplamento

Plugabilidade e reusabilidade

Escrever menos código possível

Desenvolvimento rápido!

16 / 42

Page 43: Django: desenvolvendo aplicações web de maneira simples e rápida!

Princípios (... ou filosofias)

DRY (Don’t Repeat Yourself)

Baixo acoplamento

Plugabilidade e reusabilidade

Escrever menos código possível

Desenvolvimento rápido!

16 / 42

Page 44: Django: desenvolvendo aplicações web de maneira simples e rápida!

Princípios (... ou filosofias)

DRY (Don’t Repeat Yourself)

Baixo acoplamento

Plugabilidade e reusabilidade

Escrever menos código possível

Desenvolvimento rápido!

16 / 42

Page 45: Django: desenvolvendo aplicações web de maneira simples e rápida!

Princípios (... ou filosofias)

DRY (Don’t Repeat Yourself)

Baixo acoplamento

Plugabilidade e reusabilidade

Escrever menos código possível

Desenvolvimento rápido!

16 / 42

Page 46: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 47: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 48: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 49: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 50: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 51: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 52: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 53: Django: desenvolvendo aplicações web de maneira simples e rápida!

Características

Convention over configuration

Mapeamento Objeto-Relacional (ORM)

Interface administrativa automática (CRUD)

Tratamento de formulários

URLs elegantes

Sistema de templates

Sistema de cache

Internacionalização (i18n)

17 / 42

Page 54: Django: desenvolvendo aplicações web de maneira simples e rápida!

... e o melhor, é

18 / 42

Page 55: Django: desenvolvendo aplicações web de maneira simples e rápida!

MVC? Não... MTV!

19 / 42

Page 56: Django: desenvolvendo aplicações web de maneira simples e rápida!

MTV - Overview

20 / 42

Page 57: Django: desenvolvendo aplicações web de maneira simples e rápida!

Go to the project!

21 / 42

Page 58: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando...

Download:

www.djangoproject.com/download

Desempacotando:

sudo tar -zxvf Django-x.x.x.tar.gz

python setup.py install

Ou:

sudo apt-get install python-django (SOs baseados emDebian)

22 / 42

Page 59: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando...

Download:

www.djangoproject.com/download

Desempacotando:

sudo tar -zxvf Django-x.x.x.tar.gz

python setup.py install

Ou:

sudo apt-get install python-django (SOs baseados emDebian)

22 / 42

Page 60: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando...

Download:

www.djangoproject.com/download

Desempacotando:

sudo tar -zxvf Django-x.x.x.tar.gz

python setup.py install

Ou:

sudo apt-get install python-django (SOs baseados emDebian)

22 / 42

Page 61: Django: desenvolvendo aplicações web de maneira simples e rápida!

Criando um projeto...

django-admin.py startproject <nome_do_projeto>

23 / 42

Page 62: Django: desenvolvendo aplicações web de maneira simples e rápida!

Arquivos de configuração

__init__.py - indica um pacote python

manager.py - tarefas administrativas

settings.py - configurações do projeto

urls.py - mapeamento das URLs do projeto

24 / 42

Page 63: Django: desenvolvendo aplicações web de maneira simples e rápida!

Vamos fazer algo...

No settings.py:

DATABASE.ENGINE = ‘django.db.backends.sqlite3’

DATABASE.NAME = ‘mural.db’

No diretório do projeto:

python manage.py runserver

No browser:

http://localhost:8000

25 / 42

Page 64: Django: desenvolvendo aplicações web de maneira simples e rápida!

Vamos fazer algo...

No settings.py:

DATABASE.ENGINE = ‘django.db.backends.sqlite3’

DATABASE.NAME = ‘mural.db’

No diretório do projeto:

python manage.py runserver

No browser:

http://localhost:8000

25 / 42

Page 65: Django: desenvolvendo aplicações web de maneira simples e rápida!

Vamos fazer algo...

No settings.py:

DATABASE.ENGINE = ‘django.db.backends.sqlite3’

DATABASE.NAME = ‘mural.db’

No diretório do projeto:

python manage.py runserver

No browser:

http://localhost:8000

25 / 42

Page 66: Django: desenvolvendo aplicações web de maneira simples e rápida!

Aplicações no Django

Plugabilidade

Aplicações plugáveis desenvolvidas pela comunidade

www.djangopluggables.com

26 / 42

Page 67: Django: desenvolvendo aplicações web de maneira simples e rápida!

Criando uma aplicação...

python manage.py startapp <nome_da_aplicação>

27 / 42

Page 68: Django: desenvolvendo aplicações web de maneira simples e rápida!

Arquivos da aplicação

models.py - abstração do banco de dados / entidades dosistema

tests.py - testes da aplicação

views.py - controller da aplicação

28 / 42

Page 69: Django: desenvolvendo aplicações web de maneira simples e rápida!

Criando um modelo...

29 / 42

Page 70: Django: desenvolvendo aplicações web de maneira simples e rápida!

Instalando a aplicação...

No settings.py:

INSTALLED_APPS = (... ‘jainf.mural’)

Gerando o banco de dados:

python manage.py syncdb

30 / 42

Page 71: Django: desenvolvendo aplicações web de maneira simples e rápida!

Instalando a aplicação...

No settings.py:

INSTALLED_APPS = (... ‘jainf.mural’)

Gerando o banco de dados:

python manage.py syncdb

30 / 42

Page 72: Django: desenvolvendo aplicações web de maneira simples e rápida!

Django Admin

Aplicação plugável que vem por padrão no framework

Interface administrativa gerada com muito pouco trabalho

Acelera a produtividade mas perde em flexibilidade

31 / 42

Page 73: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando o Django Admin...

Adicionar a aplicação django.contrib.admin aoINSTALLED_APPS

Descomentar as seguintes linhas no arquivo urls.py:

# from django.contrib import admin

# admin.autodiscover()

# (r‘âdmin/’, include(admin.site.urls)

32 / 42

Page 74: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando o Django Admin...

Adicionar a aplicação django.contrib.admin aoINSTALLED_APPS

Descomentar as seguintes linhas no arquivo urls.py:

# from django.contrib import admin

# admin.autodiscover()

# (r‘âdmin/’, include(admin.site.urls)

32 / 42

Page 75: Django: desenvolvendo aplicações web de maneira simples e rápida!

Registrando o modelo no Admin...

Criar o arquivo admin.py dentro do diretório da aplicação

Sincronizar o banco de dados

No browser:

http://localhost:8000/admin

33 / 42

Page 76: Django: desenvolvendo aplicações web de maneira simples e rápida!

Registrando o modelo no Admin...

Criar o arquivo admin.py dentro do diretório da aplicação

Sincronizar o banco de dados

No browser:

http://localhost:8000/admin

33 / 42

Page 77: Django: desenvolvendo aplicações web de maneira simples e rápida!

Registrando o modelo no Admin...

Criar o arquivo admin.py dentro do diretório da aplicação

Sincronizar o banco de dados

No browser:

http://localhost:8000/admin

33 / 42

Page 78: Django: desenvolvendo aplicações web de maneira simples e rápida!

Generic views

Views genéricas disponibilizadas junto com o framework

Realizam ações básicas: listar, detalhar, cadastrar, editar,excluir

34 / 42

Page 79: Django: desenvolvendo aplicações web de maneira simples e rápida!

Utilizando as generic views...

Edite o arquivo urls.py:

35 / 42

Page 80: Django: desenvolvendo aplicações web de maneira simples e rápida!

Templates

Linguagem simples para desenvolvimento de templates

Utilização de tags e filters

Tag block proporciona reusabilidade de código

36 / 42

Page 81: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando os templates...

Criar uma pasta chamada ‘templates’ na raiz do projeto

Adicionar o seguinte código ao settings.py:

import os

PROJECT_ROOT_PATH =

os.path.dirname(os.path.abspath(__file__))

TEMPLATE_DIRS =

(os.path.abspath(os.path.join(PROJECT_ROOT_PATH,

‘templates’)))

37 / 42

Page 82: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando os templates...

Criar uma pasta chamada ‘templates’ na raiz do projeto

Adicionar o seguinte código ao settings.py:

import os

PROJECT_ROOT_PATH =

os.path.dirname(os.path.abspath(__file__))

TEMPLATE_DIRS =

(os.path.abspath(os.path.join(PROJECT_ROOT_PATH,

‘templates’)))

37 / 42

Page 83: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando os templates...

Criar o arquivo templates/blog/artigo_list.html eadicionar o conteúdo:

No browser:

http://localhost:8000

38 / 42

Page 84: Django: desenvolvendo aplicações web de maneira simples e rápida!

Configurando os templates...

Criar o arquivo templates/blog/artigo_list.html eadicionar o conteúdo:

No browser:

http://localhost:8000

38 / 42

Page 85: Django: desenvolvendo aplicações web de maneira simples e rápida!

Recapitulando...

Django é fácil

Django é divertido!

Django é escalável

Django permite uma boa manutenibilidade

It rocks! USE IT!!

39 / 42

Page 86: Django: desenvolvendo aplicações web de maneira simples e rápida!

Alguém utiliza?

40 / 42

Page 87: Django: desenvolvendo aplicações web de maneira simples e rápida!

E no Brasil?

41 / 42

Page 88: Django: desenvolvendo aplicações web de maneira simples e rápida!

Obrigado!

42 / 42