Django - Sessões
Conforme discutido anteriormente, podemos usar cookies do lado do cliente para armazenar muitos dados úteis para o aplicativo da web. Vimos antes que podemos usar cookies do lado do cliente para armazenar vários dados úteis para nosso aplicativo da web. Isso leva a muitas falhas de segurança, dependendo da importância dos dados que você deseja salvar.
Por razões de segurança, o Django possui uma estrutura de sessão para manipulação de cookies. As sessões são usadas para abstrair o recebimento e o envio de cookies, os dados são salvos no lado do servidor (como no banco de dados) e o cookie do lado do cliente tem apenas um ID de sessão para identificação. As sessões também são úteis para evitar casos em que o navegador do usuário esteja configurado para 'não aceitar' cookies.
Configurando Sessões
No Django, a ativação da sessão é feita em seu projeto settings.py, adicionando algumas linhas ao MIDDLEWARE_CLASSES e a INSTALLED_APPSopções. Isso deve ser feito durante a criação do projeto, mas é sempre bom saber, entãoMIDDLEWARE_CLASSES deveria ter -
'django.contrib.sessions.middleware.SessionMiddleware'
E INSTALLED_APPS deveria ter -
'django.contrib.sessions'
Por padrão, o Django salva as informações da sessão no banco de dados (tabela ou coleção django_session), mas você pode configurar o mecanismo para armazenar informações usando outras maneiras como: file ou em cache.
Quando a sessão está habilitada, cada requisição (primeiro argumento de qualquer visão no Django) tem um atributo de sessão (dict).
Vamos criar um exemplo simples para ver como criar e salvar sessões. Nós construímos um sistema de login simples antes (veja o capítulo de processamento de formulários do Django e o capítulo Manuseio de cookies do Django). Vamos salvar o nome de usuário em um cookie para que, se não for desconectado, ao acessar nossa página de login você não verá o formulário de login. Basicamente, vamos tornar nosso sistema de login que usamos no Django Cookies mais seguro, salvando os cookies do lado do servidor.
Para isso, primeiro vamos mudar nossa visualização de login para salvar nosso cookie de nome de usuário no servidor -
def login(request):
username = 'not logged in'
if request.method == 'POST':
MyLoginForm = LoginForm(request.POST)
if MyLoginForm.is_valid():
username = MyLoginForm.cleaned_data['username']
request.session['username'] = username
else:
MyLoginForm = LoginForm()
return render(request, 'loggedin.html', {"username" : username}
Então, vamos criar a visualização formView para o formulário de login, onde não exibiremos o formulário se o cookie estiver definido -
def formView(request):
if request.session.has_key('username'):
username = request.session['username']
return render(request, 'loggedin.html', {"username" : username})
else:
return render(request, 'login.html', {})
Agora, vamos mudar o arquivo url.py para mudar o url para que ele pareie com nossa nova visualização
from django.conf.urls import patterns, url
from django.views.generic import TemplateView
urlpatterns = patterns('myapp.views',
url(r'^connection/','formView', name = 'loginform'),
url(r'^login/', 'login', name = 'login'))
Ao acessar / myapp / connection, você verá a seguinte página -
E você será redirecionado para a seguinte página -
Agora, se você tentar acessar / myapp / connection novamente, será redirecionado diretamente para a segunda tela.
Vamos criar uma visualização de logout simples que apaga nosso cookie.
def logout(request):
try:
del request.session['username']
except:
pass
return HttpResponse("<strong>You are logged out.</strong>")
E associe-o a um URL de logout em myapp / url.py
url(r'^logout/', 'logout', name = 'logout'),
Agora, se você acessar / myapp / logout, obterá a seguinte página -
Se você acessar / myapp / connection novamente, receberá o formulário de login (tela 1).
Algumas ações mais possíveis usando sessões
Vimos como armazenar e acessar uma sessão, mas é bom saber que o atributo da sessão da solicitação possui algumas outras ações úteis, como -
set_expiry (value) - Define o tempo de expiração da sessão.
get_expiry_age() - Retorna o número de segundos até que esta sessão expire.
get_expiry_date() - Retorna a data em que esta sessão irá expirar.
clear_expired() - Remove sessões expiradas do armazenamento de sessão.
get_expire_at_browser_close() - Retorna True ou False, dependendo se os cookies de sessão do usuário expiraram quando o navegador da web do usuário é fechado.