Soluções CORS, Upload de Arquivos com AJAX e Autenticação com Cookies e Sessions

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('/')

Tags: Django CORS ajax cookie session

Publicado em 9-2 00:58