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?
- Chegar método da requisição;
- Se for GET, retorna página com formulário;
- Se for POST:
- Verifica se formulário é válido, caso não, retorna erro;
- Verifica se os dados podem ser inseridos do BD, caso não, retorna erro;
- Persiste o dados no BD;
- 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