Desenvolvimento Web com Django
Django é um framework web Python de alto nível que incentiva um desenvolvimento rápido e limpo. Com sua filosofia “batteries included”, o Django fornece tudo de que você precisa para construir aplicações web robustas e de fácil manutenção.
Por que escolher o Django?
O Django oferece diversas vantagens para o desenvolvimento web:
- Rápido de desenvolver: o Django segue o princípio DRY (Don’t Repeat Yourself) e automatiza muitas tarefas
- Seguro por padrão: proteção contra as vulnerabilidades web mais comuns (XSS, CSRF, injeção de SQL…)
- Escalável: usado por sites de alto tráfego como Instagram, Pinterest e Disqus
- Batteries included: ORM integrado, admin automático, sistema de templates, autenticação…
- Comunidade ativa: documentação excelente e muitos recursos disponíveis
Instalação e configuração
Para começar com o Django, instale-o via pip:
# Criar um ambiente virtual
python -m venv venv
source venv/bin/activate # No Windows: venv\Scripts\activate
# Instalar o Django
pip install django
# Criar um novo projeto
django-admin startproject monsite
# Navegar até o projeto
cd monsite
# Criar uma aplicação
python manage.py startapp blog
Estrutura de um projeto Django
Um projeto Django típico é organizado da seguinte forma:
monsite/
manage.py
monsite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
blog/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
urls.py
migrations/
templates/
blog/
base.html
index.html
detail.html
static/
blog/
css/
js/
images/
Models: definindo seus dados
Os models do Django definem a estrutura dos seus dados:
# blog/models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "categories"
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Brouillon'),
('published', 'Publié'),
)
title = models.CharField(max_length=200)
slug = models.SlugField(unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
body = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts')
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
def __str__(self):
return self.title
class Meta:
ordering = ('-publish',)
Depois de definir seus models, crie e aplique as migrations:
python manage.py makemigrations
python manage.py migrate
Views: a lógica da sua aplicação
As views processam as requisições e retornam respostas:
# blog/views.py
from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from .models import Post, Category
def post_list(request, category_slug=None):
posts = Post.objects.filter(status='published')
category = None
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
posts = posts.filter(category=category)
paginator = Paginator(posts, 10) # 10 posts por página
page = request.GET.get('page')
posts = paginator.get_page(page)
return render(request, 'blog/post_list.html', {
'posts': posts,
'category': category
})
def post_detail(request, year, month, day, post_slug):
post = get_object_or_404(
Post,
slug=post_slug,
status='published',
publish__year=year,
publish__month=month,
publish__day=day
)
return render(request, 'blog/post_detail.html', {'post': post})
URLs: roteamento das requisições
Configure as URLs para direcionar as requisições às views apropriadas:
# blog/urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.post_list, name='post_list'),
path('category/<slug:category_slug>/', views.post_list, name='post_list_by_category'),
path('<int:year>/<int:month>/<int:day>/<slug:post_slug>/', views.post_detail, name='post_detail'),
]
# monsite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls', namespace='blog')),
]
Templates: a interface do usuário
Os templates definem como os dados são apresentados:
<!-- blog/templates/blog/base.html -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Mon Blog{% endblock %}</title>
<link rel="stylesheet" href="{% static 'blog/css/style.css' %}">
</head>
<body>
<header>
<h1>Mon Blog</h1>
<nav>
<ul>
<li><a href="{% url 'blog:post_list' %}">Accueil</a></li>
{% for cat in categories %}
<li><a href="{% url 'blog:post_list_by_category' cat.slug %}">{{ cat.name }}</a></li>
{% endfor %}
</ul>
</nav>
</header>
<main>
{% block content %}
{% endblock %}
</main>
<footer>
<p>© {% now "Y" %} Mon Blog</p>
</footer>
</body>
</html>
<!-- blog/templates/blog/post_list.html -->
{% extends "blog/base.html" %}
{% block title %}
{% if category %}{{ category.name }}{% else %}Articles{% endif %}
{% endblock %}
{% block content %}
<h2>
{% if category %}
Articles dans la catégorie "{{ category.name }}"
{% else %}
Tous les articles
{% endif %}
</h2>
{% for post in posts %}
<article>
<h3><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h3>
<p class="date">Publié le {{ post.publish }} par {{ post.author }}</p>
<p>{{ post.body|truncatewords:30|linebreaks }}</p>
</article>
{% empty %}
<p>Aucun article disponible.</p>
{% endfor %}
{% include "pagination.html" with page=posts %}
{% endblock %}
Administração do Django
O Django fornece uma interface de administração pronta para uso:
# blog/admin.py
from django.contrib import admin
from .models import Category, Post
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'slug')
prepopulated_fields = {'slug': ('name',)}
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'author', 'publish', 'status')
list_filter = ('status', 'created', 'publish', 'author')
search_fields = ('title', 'body')
prepopulated_fields = {'slug': ('title',)}
raw_id_fields = ('author',)
date_hierarchy = 'publish'
ordering = ('status', 'publish')
Executando o servidor de desenvolvimento
Para testar sua aplicação:
python manage.py runserver
Acesse http://127.0.0.1:8000/ no seu navegador.
Funcionalidades avançadas
O Django oferece diversas funcionalidades avançadas:
- Autenticação: sistema completo de gerenciamento de usuários
- Formulários: criação, validação e processamento de formulários
- Testes: framework de testes integrado
- Internacionalização: suporte multilíngue
- Cache: vários níveis de cache
- Segurança: proteção contra ataques comuns
Deploy
Para fazer o deploy de uma aplicação Django em produção:
- Configure os parâmetros de produção no
settings.py - Colete os arquivos estáticos:
python manage.py collectstatic - Escolha um servidor WSGI, como Gunicorn ou uWSGI
- Configure um servidor web, como Nginx ou Apache
- Use um banco de dados robusto, como PostgreSQL
Conclusão
O Django é um framework poderoso que permite construir rapidamente aplicações web complexas e seguras. Sua filosofia “batteries included” e sua estrutura bem organizada fazem dele uma excelente escolha para desenvolvedores Python que desejam criar sites robustos e de fácil manutenção.
Seja para construir um simples blog, um e-commerce ou uma aplicação web complexa, o Django oferece as ferramentas necessárias para o sucesso do seu projeto.
Sobre InSkillCoach
Especialista em treinamento e tecnologias
Coach especializado em tecnologias avançadas e IA, apoiado pela GNeurone Inc.
Certificações:
- AWS Certified Solutions Architect – Professional
- Certificações Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentários
Os comentários são alimentados pelo GitHub Discussions
Conecte-se com o GitHub para participar da discussão