Trabalhando com Cookies no Django
Os cookies são uma forma simples e amplamente utilizada para armazenar informações do usuário no cliente. Eles ficam armazenados no dispositivo do cliente e podem ser configurados tanto pelo servidor quanto pelo próprio cliente. Como os cookies são enviados junto com cada requisição ao servidor, eles têm um limite de tamanho máximo de 4096 bytes. A seguir, abordamos como configurar e recuperar cookies em aplicações Django.
Definindo Cookies
Para enviar cookies ao cliente, o método set_cookie()
da classe HttpResponse é utilizado. A assinatura do método é a seguinte:
set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)
Os parâmetros desse método permitem configurar o comportamento dos cookies:
key
: Nome ou identificador do cookie.value
: Valor associado ao cookie.max_age
: Tempo de vida do cookie em segundos. Pode ser um objetotimedelta
, um número inteiro ouNone
(padrão), o que indica que o cookie será apagado ao final da sessão do navegador.expires
: Data e hora de expiração do cookie, podendo ser uma string no formato "Wdy, DD-Mon-YY HH:MM:SS GMT
" ou um objetodatetime.datetime
.path
: Caminho no qual o cookie será válido.domain
: Domínio ao qual o cookie será aplicado.secure
: Determina se o cookie será enviado apenas em conexões HTTPS. QuandoTrue
, o envio ocorre apenas via HTTPS.httponly
: Controla o acesso do JavaScript ao cookie. Configurar comoTrue
impede que scripts no cliente leiam o cookie.samesite
: Especifica se o cookie será enviado em requisições entre domínios. Valores possíveis:'Strict'
e'Lax'
: Bloqueiam o envio em requisições de outros domínios.'None'
: Permite o envio em requisições entre domínios (padrão).
A classe HttpResponse
também fornece o método set_signed_cookie()
, que adiciona criptografia ao valor do cookie. Esse método aceita os mesmos parâmetros e adiciona o argumento opcional salt
, que define uma chave extra para criptografia.
Exemplo de Configuração de Cookies
O exemplo abaixo ilustra a definição de cookies no arquivo views.py
:
from django.http import HttpResponse
def set_cookie(request):
username = request.GET.get("username", "Undefined")
response = HttpResponse(f"Hello {username}")
response.set_cookie("username", username)
return response
Neste exemplo, o valor do parâmetro username
é extraído da query string e armazenado em um cookie chamado username
. O cookie é então enviado ao cliente na resposta.
No arquivo urls.py
, a função é associada à rota /set
:
from django.urls import path
from hello import views
urlpatterns = [
path("set", views.set_cookie),
]
Ao acessar a URL /set
com o parâmetro username
, o servidor configura o cookie, que é armazenado pelo navegador.
Recuperando Cookies
Para acessar cookies não criptografados, o atributo COOKIES
do objeto HttpRequest
pode ser utilizado. Ele é um dicionário onde as chaves correspondem aos nomes dos cookies.
Para cookies criptografados configurados com set_signed_cookie
, o método get_signed_cookie()
do objeto HttpRequest
é utilizado:
get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
Os parâmetros desse método são:
key
: Nome do cookie a ser recuperado.default
: Valor padrão retornado caso o cookie não seja encontrado.max_age
: Tempo de vida máximo do cookie em segundos.salt
: A mesma chave de criptografia utilizada na configuração do cookie.
Exemplo de Recuperação de Cookies
O exemplo abaixo ilustra a recuperação de cookies previamente configurados:
def get_cookie(request):
username = request.COOKIES.get("username", "Guest")
return HttpResponse(f"Hello {username}")
Neste exemplo, o valor do cookie username
é recuperado e enviado ao cliente na resposta. Caso o cookie não exista, o valor padrão "Guest"
será utilizado.
No arquivo urls.py,
a função é associada à rota /get
:
from django.urls import path
from hello import views
urlpatterns = [
path("set", views.set_cookie),
path("get", views.get_cookie),
]
Ao acessar a URL /get
, o servidor retorna o valor do cookie username
previamente configurado.
Documentação oficial: