django

O framework web para perfeccionistas com prazos

 perfeccionistas

prazos

Por que Django?

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Ola, mundo!");
    }
}

#include <stdio.h>

main()
{
    printf("Ola, mundo!");
}
print "Ola, mundo!"

Baterias incluídas

DRY (don't repeat yourself)

O fácil é fácil

O complexo é possível

Documentação imensa

Comunidade

Extremamente testado

?

Quem usa?

Mas escala?

http://blog.disqus.com/post/62187806135/scaling-django-to-8-billion-page-views

Models
Views
Templates

M
V
T

Browser

URL

Templates

Views

Models

Database

{

}

Colab

API

accounts

search

super_archives

https://github.com/interlegis/colab

$ pip install django
$ django-admin.py startproject engblog

Iniciando o projeto

http://virtualenvwrapper.readthedocs.org/

$ cd engblog && tree
.
├── engblog
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
$ python manage.py startapp blog
$ tree
.
├── blog
│   ├── admin.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── engblog
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Criando uma app

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
)

settings.py

class Post(models.Model):
    titulo = models.CharField(max_length=200)
    texto = models.TextField()
    publicado = models.BooleanField(default=True)
    criacao = models.DateTimeField(auto_now_add=True)
    modificacao = models.DateTimeField(auto_now=True)

models.py

BEGIN;
CREATE TABLE "blog_post" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "titulo" varchar(200) NOT NULL,
    "texto" text NOT NULL,
    "publicado" bool NOT NULL,
    "data_criacao" datetime NOT NULL,
    "modificado" datetime NOT NULL
)
;

COMMIT;

models.py

class Marca(models.Model):
    # ...
    pass

class Carro(models.Model):
    marca = models.ForeignKey(Marca)
    # ...

Relacionamentos

class Borda(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    bordas = models.ManyToManyField(Borda)

Relacionamentos

AutoField
BigIntegerField
BinaryField
BooleanField
CharField
CommaSeparatedIntegerField
DateField
DateTimeField
DecimalField
DurationField
EmailField
FileField
        -FileField and FieldFile

FilePathField

    FloatField
    ImageField
    IntegerField
    IPAddressField
    GenericIPAddressField
    NullBooleanField
    PositiveIntegerField
    PositiveSmallIntegerField
    SlugField
    SmallIntegerField
    TextField
    TimeField
    URLField
    UUIDField

class ContatoForm(forms.Form):
    assunto = forms.CharField(max_length=100)
    mensagem = forms.CharField(widget=forms.Textarea)
    email = forms.EmailField()

forms.py

BooleanField

CharField

ChoiceField

TypedChoiceField

DateField

DateTimeField

DecimalField

DurationField

EmailField

FileField

FilePathField

FloatField

ImageField

IntegerField

IPAddressField

GenericIPAddressField

MultipleChoiceField

TypedMultipleChoiceField

NullBooleanField

RegexField

SlugField

TimeField

URLField

UUIDField

class ContatoForm(forms.Form):
    assunto = forms.CharField(max_length=100)
    mensagem = forms.CharField(widget=forms.Textarea)
    email = forms.EmailField()
class Contato(models.Model):
    assunto = models.CharField(max_length=100)
    mensagem = models.TextField()
    email = models.EmailField()
class ContatoForm(forms.ModelForm):
    class Meta:
        model = Contato
        fields = ['contato', 'assunto', 'mensagem']

ModelForm

from django.http import HttpResponse

def ola_mundo(request):
    return HttpResponse('Olá, mundo!')

views.py

View para criar novo Post?

  1. Chegar método da requisição;
  2. Se for GET, retorna página com formulário;
  3. Se for POST:
    1. Verifica se formulário é válido, caso não, retorna erro;
    2. Verifica se os dados podem ser inseridos do BD, caso não, retorna erro;
    3. Persiste o dados no BD;
    4. Retorna página de sucesso.
from django.views.generic.edit import CreateView
from blog.models import Post


class CriarPost(CreateView):
    model = Post
    fields = ['titulo', 'texto', 'publicado']

Class-based views

Class-based views

  • CreateView
  • ListView
  • DeleteView
  • UpdateView
  • FormView
  • TemplateView
  • RedirectView
<h1>Olá, {{ nome }}</h1>

Templates

<!doctype html>
<html lang="en">
<head>
    <title>EngBlog</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

base.html

{% extends 'base.html' %}
{% block content %}

    {% for post in posts %}
        <h2>{{ post.titulo }}</h2>
        <p>{{ post.criacao }}</p>
        <p>{{ post.texto }}</p>
    {% endfor %}

{% endblock %}

home.html

Admin do Django

https://github.com/rosarior/awesome-django

Autenticação em redes sociais, autenticação de dois passos, API REST, processo de pagamento, busca em bd textuais, CMS, e-Commerce, gerenciamento de projetos, etc

rougeth.com

/rougeth

@marcorougeth

marco@rougeth.com

Obrigado!

django, perfeccionistas e prazos

By Marco Rougeth

django, perfeccionistas e prazos

  • 1,200