Sessões Django

Resumo : neste tutorial, você aprenderá como funcionam as sessões do Django e como definir várias configurações para a sessão.

Introdução às sessões do Django

Django possui uma estrutura de sessão que suporta sessões anônimas e de usuário. Django usa o middleware de sessão para enviar e receber cookies.

A imagem a seguir ilustra como funcionam as sessões do Django:

sessões de Django

Quando um navegador da web faz a primeira solicitação HTTP ao servidor da web, o middleware de sessão inicia uma nova sessão. O middleware de sessão gera um número grande e aleatório que é chamado de identificador de sessão e o envia de volta ao navegador como um cookie.

Para as solicitações subsequentes, o middleware de sessão combina o valor sessioniddo cookie enviado pelo navegador da web com o identificador de sessão armazenado no servidor da web e associa os dados da sessão ao objeto de solicitação HTTP.

Para usar sessões, você precisa garantir que as MIDDLEWAREconfigurações do seu projeto ( settings.py) contenham o middleware da sessão assim:

MIDDLEWARE = [
    # other middleware
    'django.contrib.sessions.middleware.SessionMiddleware',
    # ...
]
Linguagem de código:  Python  ( python )

O middleware de sessão é adicionado por MIDDLEWAREpadrão quando você cria um novo projeto usando o startprojectcomando.

O middleware de sessão habilita sessões através da sessionpropriedade do objeto request ( HttpRequest):

request.sessionLinguagem de código:  Python  ( python )

O request.sessioné um dicionário que permite armazenar e recuperar dados da sessão. Aceita request.sessionqualquer objeto que possa ser serializado para JSON por padrão.

Ao contrário de outros objetos, request.sessionpersiste de uma solicitação HTTP para a próxima solicitação.

Para definir uma variável na sessão, você pode usar o request.sessionseguinte:

request.session['visit'] = 1Linguagem de código:  Python  ( python )

Esta instrução define a variável visit como 1.

Para recuperar uma chave de sessão, você usa o get()método do request.sessionobjeto:

request.session.get('visit')Linguagem de código:  Python  ( python )

Para excluir uma chave na sessão, você usa a delinstrução:

del request.session['visit']Linguagem de código:  Python  ( python )

Configurando sessões do Django

Por padrão, o Django armazena dados de sessão em um banco de dados usando o Sessionmodelo da django.contrib.sessionsaplicação. No entanto, você pode escolher outros mecanismos de sessão usando o SESSION_ENGINE.

Django fornece as seguintes opções para armazenar dados de sessão:

Opções Descrição
Sessões de banco de dados Armazene os dados da sessão no django_session do banco de dados. Este é o mecanismo padrão.
Sessões baseadas em arquivo Armazene dados da sessão no sistema de arquivos.
Sessões em cache Armazene dados de sessão em um back-end de cache. Para definir o back-end do cache, você usa a CACHESconfiguração.
Sessões de banco de dados em cache Armazene dados de sessão em um cache e banco de dados write-through. Se os dados não estiverem no cache, o Django irá ler os dados da sessão do banco de dados.
Sessões baseadas em cookies Armazene dados de sessão nos cookies que são enviados ao navegador da web.

Observe que um mecanismo de sessão baseado em cache oferece melhor desempenho em comparação com outros mecanismos de sessão.

Django suporta Memcached pronto para uso. Além disso, você pode encontrar um pacote de terceiros para gerenciar back-ends de cache para Redis e outros sistemas de cache.

Além do SESSION_ENGINEDjango, você pode personalizar sessões com configurações específicas. A tabela a seguir lista os mais importantes:

Configurações de sessão Descrição
SESSION_COOKIE_AGE A duração dos cookies de sessão na sessão. O padrão é duas semanas (1.209.600 segundos)
SESSION_COOKIE_DOMAIN Defina o domínio para cookies de sessão.
SESSION_COOKIE_HTTPONLY Defina como True para evitar que o JavaScript acesse o cookie da sessão. O padrão é True, o que aumenta a segurança contra sequestro de sessão do usuário.
SESSION_COOKIE_SECURE Defina como True para indicar que o cookie só deve ser enviado se a conexão for HTTPS. O padrão é Falso.
SESSION_EXPIRE_AT_BROWSER_CLOSE Defina como True para expirar a sessão ao fechar o navegador. Seu valor padrão é Falso. Se você definir como True, SESSION_COOKIE_AGE não terá nenhum efeito.
SESSION_SAVE_EVERY_REQUEST Defina como True para salvar a sessão e atualizar a expiração da sessão no banco de dados em cada solicitação. O padrão é Falso.

Exemplo de sessões Django

Primeiro, adicione um URL ao urlpatternsarquivo urls.py:

urlpatterns = [
    path('visit/', views.count_visit, name='visit')
]Linguagem de código:  Python  ( python )

Quando você navega para http://localhost:8000/visit, a count_visitfunção em views.py será executada.

Segundo, defina a count_visit()função no views.pyarquivo:

def count_visit(request):
    visit = request.session.get('visit',0) + 1
    request.session['visit'] = visit
    return HttpResponse(f"Visit count:{request.session['visit']}")Linguagem de código:  Python  ( python )

A count_visit()função usa request.sessionpara aumentar a visitvariável cada vez que você visita o http://localhost:8000/visitURL. Também exibe o valor atual da visitvariável na página web:

Se você visualizar os cookies no navegador da web, verá um cookie com o nome sessionid:

sessões Django - cookies

O valor do sessionid corresponde ao session_key na tabela django_session:

sessões Django - banco de dados

Os dados da sessão são uma string codificada em base64. Para analisá-lo, você usa o seguinte código:

from base64 import b64decode

data = base64decode('eyJ2aXNpdCI6MTF9:1ov84c:qngX5Woil1EDwGGylot0OrQtche6734UOApKJ4yp-BA')
print(data)Linguagem de código:  Python  ( python )

Saída:

b'{"visit":11}\xd6\x8b\xfc\xe1\xca\xa7\x81~V\xa2)u\x10<\x06\x1b)h\xb7C\xabB\xd7!{\xae\xf7\xe1C\x80\xa4\xa2x\xca\x90@'Linguagem de código:  texto simples  ( texto simples )

Resumo

  • Uma sessão é uma variável que reside nas solicitações.
  • Django usa middleware de sessão para gerenciar sessões.
  • Use request.sessionpara gerenciar dados da sessão.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *