name: base layout: true --- name: inverse-center template: base class: inverse, middle, center layout: true --- template: inverse-center # Django em 50 minutos ## O framework para perfeccionistas com prazos --- name: agenda template: base .left-column[ # Agenda ] .right-column[ ## Quem? ## O que é Django? ## Como o Django Funciona? ## Hello World ## E agora? ] --- name: quem-somos template: base layout: true .left-column[ # Quem? ] --- name: quem-somos-empresa-1 template: quem-somos .right-column[ ## George Silva ### Diretor técnico SIGMA ### Foco principal: Soluções em Geoprocessamento, com tecnologia
livre
. ### Áreas de atuação: >
Desenvolvimento de Sistemas
; > Banco de Dados Espacial; > Cartografia Digital e Sensoriamento Remoto; ### Principais clientes: -
PRODAM-SP
-
Ministério da Saúde
-
Força Aérea Brasileira
] --- name: quem-somos-empresa-2 template: quem-somos .right-column[ ## Alguns números da SIGMA ### 12 colaboradores; ### Já mapeamos mais de
40 mil
km2; ###
9 sistemas
, atualmente em
produção 24/7
; ### 17 pacotes open-source publicados; ### mais de
300 contribuições
em projetos open-source; ### mais de
2000 km
em contribuições para o OpenStreetMap; ] --- name: base-o-que-e layout: true .left-column[ # O que é o Django? ] --- name: oqueeodjango template: inverse-center # O que é o Django? --- name: django-unchained template: base background-image: url(imagens/django-unchained.jpg) --- name: django-vereador template: base background-image: url(imagens/django-vereador.jpg) --- name: o-que-e template: base-o-que-e .right-column[ ## Framework escrito em Python ## Utiliza o padrão MVT (Model, View, Template) ## Rápido e de fácil desenvolvimento ## Seguro ## Escalável ] --- name: quem-usa template: base .left-column[ # Quem usa esta parada? ] .right-column[ # Instagram # Mozilla # G1 # National Geographic # NASA # INCRA, MDA, MS e possivelmente outros órgãos do Gov. Federal #
Nós
] --- name: base-como-funciona layout: true template: base .left-column[ # Como funciona? ] --- name: mvt template: base-como-funciona .right-column[ # Framework MVT ## Model (mapeia entidades) ## View (encapsula lógica) ## Template (apresenta os dados) ] --- name: mvt2 template: base  --- name: fluxo-http template: base-como-funciona .right-column[ # Fluxo Requisição HTTP ## Tudo começa com uma requisição HTTP ## Django captura e compara com as urls (ou rotas) ## Django invoca a view correspondente ## View faz o trabalho pesado ## View decide o que deve ser feito e devolve resposta HTTP ] --- name: fluxo-http2 template: base  --- name: base-hello-world layout: true .left-column[ # Hello World ] --- name: hw1 template: base-hello-world .right-column[ # Como começar? ## virtualenv ```bash sudo apt-get update && sudo apt-get install python-virtualenv ``` ## criar virtualenv ```bash mkdir -p ~/.virtualenvs cd ~/.virtualenvs virtualenv django-hello-world ``` ## instalar django ```bash source ~/.virtualenvs/django-hello-world/bin/activate pip install django ``` ] --- name: hw2 template: base-hello-world .right-column[ # Iniciando o projeto ```bash mkdir -p ~/projetos/hello-world cd ~/projetos/hello-world django-admin startproject hello_world . ``` ## resultado ```text . ├── hello_world │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 1 directory, 5 files ```
Esta estrutura não é recomendada para produção. É apenas um hello-world!
] --- name: hw3 template: base-hello-world .right-column[ ## Testando nosso projeto ```bash ./manage.py runserver ``` ## Acesse localhost ```bash firefox localhost:8000 ``` ## Viu isso?  ] --- name: hw4 template: base background-image: url(imagens/great-success.png) --- name: hw5 template: base-hello-world .right-column[ # Apps ## O django usa as apps como forma de quebrar seu projeto ## As apps são separações lógicas de código ## Devem conter funcionalidade sem repetição ## Promovem reuso de código ## São
"mini-projetos"
] --- name: hw6 template: base background-image: url(imagens/app-strut.jpg) --- name: hw7 template: base-hello-world .right-column[ # Criando sua primeira app ```bash # assumindo que estamos na raiz do projeto: ~/projetos/hello-world ./manage.py startapp meetups ``` ## Djanguinho gente boa ```bash # ainda na raiz do projeto ls > db.sqlite3 hello_world manage.py meetups cd meetups ls > admin.py __init__.py migrations models.py tests.py views.py ``` ] --- name: hw8 template: base-hello-world .right-column[ ## Instale sua app ```python # ... settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'meetups', # <=== adicionamos nossa app aqui ) # ... ``` # Criando sua primeira view abra o
meetups/views.py
] --- name: hw9 template: base-hello-world .right-column[ ## Era assim ```python # meetups/views.py from django.shortcuts import render # Create your views here. ``` ## Vamos renderizar um olá mundo ```python # meetups/views.py # coding: utf-8 <=== estamos usando Python 2.7, temos que declarar o encoding from django.http import HttpResponse # <=== novo import from django.shortcuts import render # <=== por agora não usaremos o render def home(request): # nossa string deve ser passada como unicode, por isso "uzinho" return HttpResponse(u'Olá Mundo') ``` ] --- name: hw10 template: base-hello-world .right-column[ ## Ok, mas como vejo isso no meu servidor? Precisamos criar a
URL
ou rota necessária para enxergarmos isso aí. Abra o arquivo
hello_world/urls.py
```python # hello_world/urls.py from django.conf.urls import include, url from django.contrib import admin from meetups.views import home urlpatterns = [ url(r'^$', home, name='home'), url(r'^admin/', include(admin.site.urls)), ] ``` ## Recarregue localhost:8000
existem várias considerações de arquitetura a serem feitas neste slide. esta **não** é a forma ideal de organizar um projeto.
] --- name: hw11 template: base-hello-world .right-column[ # Modelos ## Modelos são onde abstraimos os dados do sistema ## Modelos são (idealmente) independentes da camada de persistência ## O Django sabe criar as tabelas para você*
Mas isso não é desculpa para não aprender SQL. Aliás, SQL é fundamental.
] --- name: hw12 template: base-hello-world .right-column[ # Criando o primeiro modelo Abra o arquivo
meetups/models.py
```python from django.db import models # Create your models here. ``` Vamos adicionar um modelo. Modelo são representados por classes. ```python from django.db import models class Meetup(models.Model): pass ``` Este modelo não faz nada, mas é a declaração mínima para o mesmo existir. Vamos adicionar alguns atributos neste modelo. ] --- name: hw13 template: base-hello-world .right-column[ ```python from django.db import models class Meetup(models.Model): nome = models.CharField(max_length=128, verbose_name='Nome') data = models.DateTimeField(verbose_name='Data/Hora') ``` Agora que nosso modelo já existe, vamos validar ele com o Django. ```bash # raiz do projeto ./manage.py check > System check identified no issues (0 silenced). ``` Ok, sem tretas. Vamos aplicar as mudanças no banco de dados.
Você pode usar validate ou check. Validate nas versões anteriores e check em Django > 1.9
] --- name: hw14 template: base-hello-world .right-column[ #
Migrações
## Migrações são a forma utilizada para controlar o
modelo de dados
## O fluxo é: 1. Alterar/criar modelo; 1. Registras as mudanças; 1. Aplicar as mudanças; Já fizemos a parte 1, que foi criar o modelo meetup e adicionar os campos relevantes. Vamos registrar as mudanças: ```bash # raiz do projeto ./manage.py makemigrations meetups > Migrations for 'meetups': > 0001_initial.py: > - Create model Meetup ``` ] --- name: hw15 template: base-hello-world .right-column[ Saca só o
meetups/migrations/0001_initial.py
```python # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ] operations = [ migrations.CreateModel( name='Meetup', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('nome', models.CharField(max_length=128, verbose_name=b'Nome')), ('data', models.DateTimeField(verbose_name=b'Data/Hora')), ], ), ] ``` ] --- name: hw16 template: base-hello-world .right-column[ Dentro da migração tem tudo que o Django precisa para sincronizar nosso modelo com o banco de dados. Digita-ai: ```bash # raiz do projeto ./manage.py migrate > Operations to perform: > Apply all migrations: admin, auth, contenttypes, meetups, sessions > Running migrations: > Applying auth.0001_initial... OK > Applying admin.0001_initial... OK > Applying admin.0002_logentry_remove_auto_add... OK > Applying contenttypes.0002_remove_content_type_name... OK > Applying auth.0002_alter_permission_name_max_length... OK > Applying auth.0003_alter_user_email_max_length... OK > Applying auth.0004_alter_user_username_opts... OK > Applying auth.0005_alter_user_last_login_null... OK > Applying auth.0006_require_contenttypes_0002... OK > Applying auth.0007_alter_validators_add_error_messages... OK > Applying auth.0008_alter_user_username_max_length... OK > Applying sessions.0001_initial... OK ``` Pronto, nosso banco agora tem um monte de tabelas, incluindo a tabela dos meetups. ] --- name: hw17 template: base-hello-world .right-column[ # Criando meetups Para não ficar muito longo, vamos criar alguns meetups via shell e depois mostrá-los na nossa tela campeã. ```bash # raiz do projeto ./manage.py shell Python 2.7.12 (default, Jul 1 2016, 15:12:24) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> ``` Um shell python foi aberto.
ooooh!
Agora, vamos importar o modelo dos Meetups. Digitai: ```python from meetups.models import Meetup meetup1 = Meetup() ``` ] --- name: hw18 template: base-hello-world .right-column[ Temos um objeto do tipo meetup no nosso shell. Podemos fazer algumas coisas com ele, como assinalar valores para nome e data. PS: temos que importar o pacote de data/hora para fazer tudo certim. ```python from datetime import datetime data_hora_do_meetup = datetime(2016, 9, 24) # ano, mes e dia meetup1.nome = u'Meetup da Python Triângulo' meetup1.data = data_hora_do_meetup meetup1.save() ``` Vocês podem construir quantos meetups quiserem.
É bem provavel que algo feio apareceu na sua tela, um RuntimeWarning. Não se preocupe, isso foi porquê passamos pro data um valor de data/hora sem informação de fuso-horário.
] --- name: hw19 template: base-hello-world .right-column[ # Mostrando dados Agora precisamos alterar nossa view para fazer o seguinte: 1. Consultar o banco de dados; 1. Apresentar os dados de forma "bonita" usando um template; Vamos lá: ```python # meetups/views.py # coding: utf-8 from django.shortcuts import render from django.http import HttpResponse from .models import Meetup def home(request): meetups = Meetup.objects.all() return render(request, 'meetups/index.html', {'meetups': meetups}) ``` ] --- name: hw20 template: base-hello-world .right-column[ Se você tentar dar um reload na página agora, vai ocorrer um erro! O template
meetups/index.html
non ecziste! Vamos criá-lo ```bash # diretorio raiz do projeto mkdir -p meetups/templates/meetups touch meetups/templates/meetups/index.html ``` Recarregue a página! Você verá uma bela página em branco. Tudo bem, o Django agora encontrou o template em questão e conseguiu renderizá-lo. Só está em branco pois o template está em branco. Vamos editá-lo. ] --- name: hw21 template: base-hello-world .right-column[ ```xml
Meetups
Meetups
{% for m in meetups %}
{{ m.nome }}
{{ m.data }}
{% endfor %} ``` ] --- name: e agora? template: base .left-column[ # E agora, José? ] .right-column[ # http://djangoproject.com ] --- name: duvidas template: base class: inverse, middle, center #
Dúvidas?
##
Questionamentos?
###
Esclarecimentos?
--- name: contatos template: base class: center background-image: url(imagens/logo-sigma.png) # George Rodrigues da Cunha Silva #### george@sigmageosistemas.com.br #### @georgersilva