Django - Manuseio de Cookies

Às vezes, você pode desejar armazenar alguns dados por visitante do site, de acordo com os requisitos de seu aplicativo da web. Lembre-se sempre de que os cookies são salvos no lado do cliente e, dependendo do nível de segurança do navegador do cliente, a configuração de cookies pode funcionar às vezes e às vezes não.

Para ilustrar a manipulação de cookies no Django, vamos criar um sistema usando o sistema de login que criamos antes. O sistema irá mantê-lo conectado por X minutos de tempo e, além desse tempo, você estará fora do aplicativo.

Para isso, você precisará configurar dois cookies, last_connection e username.

Primeiramente, vamos mudar nossa visualização de login para armazenar nosso nome de usuário e cookies last_connection -

from django.template import RequestContext

def login(request):
   username = "not logged in"
   
   if request.method == "POST":
      #Get the posted form
      MyLoginForm = LoginForm(request.POST)
   
   if MyLoginForm.is_valid():
      username = MyLoginForm.cleaned_data['username']
   else:
      MyLoginForm = LoginForm()
   
   response = render_to_response(request, 'loggedin.html', {"username" : username}, 
      context_instance = RequestContext(request))
   
   response.set_cookie('last_connection', datetime.datetime.now())
   response.set_cookie('username', datetime.datetime.now())
	
   return response

Conforme visto na visão acima, a configuração do cookie é feita pelo set_cookie chamado na resposta, não na solicitação, e observe também que todos os valores de cookies são retornados como string.

Vamos agora criar um formView para o formulário de login, onde não exibiremos o formulário se o cookie estiver definido e não tiver mais de 10 segundos -

def formView(request):
   if 'username' in request.COOKIES and 'last_connection' in request.COOKIES:
      username = request.COOKIES['username']
      
      last_connection = request.COOKIES['last_connection']
      last_connection_time = datetime.datetime.strptime(last_connection[:-7], 
         "%Y-%m-%d %H:%M:%S")
      
      if (datetime.datetime.now() - last_connection_time).seconds < 10:
         return render(request, 'loggedin.html', {"username" : username})
      else:
         return render(request, 'login.html', {})
			
   else:
      return render(request, 'login.html', {})

Como você pode ver no formView acima, o acesso ao cookie que você configurou é feito através do atributo COOKIES (dict) da solicitação.

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ê obterá a seguinte página -

E você será redirecionado para a seguinte tela ao enviar -

Agora, se você tentar acessar / myapp / connection novamente na faixa de 10 segundos, você será redirecionado diretamente para a segunda tela. E se você acessar / myapp / connection novamente fora desta faixa, você receberá o formulário de login (tela 1).