Quanndo o frontend e backend operam em portas, protocolos ou servidores distintos, ocorrem problemas de compartilhamento de recursos entre origens (CORS).
Configuração no Django
Instale o módulo django-cors-headers:
pip install django-cors-headers
Configure no settings.py:
# Registrar aplicação
INSTALLED_APPS = [
...
'corsheaders',
]
# Adicionar middleware
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
]
# Permitir todas as origens
CORS_ORIGIN_ALLOW_ALL = True
Upload e Download de Arquivos com AJAX
Frontend - Formulário de Upload
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Sistema de Arquivos</title>
<link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<h2>Gerenciamento de Arquivos</h2>
<form>
<input type="file" class="fileInput" multiple>
<button type="button" class="uploadBtn btn-primary">Enviar Arquivos</button>
</form>
<a href="http://127.0.0.1:8000/download/" class="downloadLink">Baixar Arquivo</a>
</body>
<script src="bootstrap-3.3.7-dist/js/jq.js"></script>
<script>
$('.uploadBtn').on('click', function() {
const arquivos = $('.fileInput')[0].files;
for (let i = 0; i < arquivos.length; i++) {
const dadosForm = new FormData();
dadosForm.append('arquivo', arquivos[i]);
$.ajax({
url: 'http://127.0.0.1:8000/upload/',
type: 'POST',
data: dadosForm,
contentType: false,
processData: false,
success: function(resposta) {
console.log('Upload concluído:', resposta);
}
});
}
});
$('.downloadLink').on('click', function(e) {
e.preventDefault();
window.location.href = 'http://127.0.0.1:8000/download/';
});
</script>
</html>
Backend - Views do Django
from django.http import HttpResponse, FileResponse
from django.shortcuts import render
def processar_upload(request):
arquivo = request.FILES.get('arquivo')
if arquivo:
with open(arquivo.name, 'wb') as destino:
for chunk in arquivo.chunks():
destino.write(chunk)
return HttpResponse('Arquivo recebido com sucesso')
return HttpResponse('Nenhum arquivo encontrado')
def processar_download(request):
arquivo_path = 'documento_exemplo.py'
try:
arquivo = open(arquivo_path, 'rb')
resposta = FileResponse(arquivo)
resposta['Content-Type'] = 'application/octet-stream'
resposta['Content-Disposition'] = f'attachment; filename="{arquivo.name}"'
return resposta
except FileNotFoundError:
return HttpResponse('Arquivo não encontrado', status=404)
Autenticação com Cookies
Cookies permitem armazenar dados no navegador do cliente para maintain estado entre requisições.
Manipulação de Cookies no Django
# Configurar resposta
resposta = HttpResponse('Dados processados')
# Definir cookie simples
resposta.set_cookie('usuario_id', '12345', max_age=3600)
# Remover cookie
resposta.delete_cookie('usuario_id')
# Definir cookie assinado (criptografado)
resposta.set_signed_cookie('token_acesso', 'xyz789', salt='chave_secreta')
# Ler cookie no request
valor_cookie = request.COOKIES.get('usuario_id', None)
# Ler cookie assinado
valor_assinado = request.get_signed_cookie('token_acesso', salt='chave_secreta')
Autenticação com Sessions
Sessions oferecem armazenamento mais seguro no servidor, com apenas um identificador no cliente.
Operações de Session no Django
# Armazenar dados na session
request.session['perfil_usuario'] = {
'nome': 'João Silva',
'nivel_acesso': 'admin',
'autenticado': True
}
# Recuperar dados da session
perfil = request.session.get('perfil_usuario', {})
autenticado = request.session.get('autenticado', False)
# Encerrar session
request.session.flush() # Remove session e cookie
Configurações de Session
No settings.py, você pode configurar diferentes backends de armazenamento:
# Armazenamento em banco de dados (padrão)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# Armazenamento em cache
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# Armazenamento em arquivo
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/tmp/sessions'
# Cache + banco de dados
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
# Configurações adicionais
SESSION_COOKIE_NAME = "sessionid"
SESSION_COOKIE_AGE = 1209600 # 14 dias
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
Implementação de Sistema de Login
Exemplo completo de autenticação usando decorator para proteção de rotas:
from django.shortcuts import render, redirect
from functools import wraps
def verificar_autenticacao(view_func):
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if not request.session.get('usuario_autenticado'):
url_retorno = request.get_full_path()
return redirect(f'/acesso/?proxima={url_retorno}')
return view_func(request, *args, **kwargs)
return wrapper
@verificar_autenticacao
def dashboard(request):
dados_usuario = request.session.get('dados_usuario', {})
return render(request, 'dashboard.html', {'usuario': dados_usuario})
def tela_login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
credenciais = request.POST
proxima_pagina = request.GET.get('proxima', '/dashboard')
usuario = credenciais.get('username')
senha = credenciais.get('password')
# Validação (exemplo simplificado)
if usuario == 'admin' and senha == 'senha123':
request.session['dados_usuario'] = {
'username': usuario,
'role': 'administrador'
}
request.session['usuario_autenticado'] = True
return redirect(proxima_pagina)
# Falha na autenticação
request.session['usuario_autenticado'] = False
return render(request, 'login.html', {'erro': 'Credenciais inválidas'})
@verificar_autenticacao
def area_restrita(request):
info_usuario = request.session.get('dados_usuario', {})
return render(request, 'restrita.html', {'info': info_usuario})
def logout_sistema(request):
request.session.flush()
return redirect('/')