Aula 40 - Loja Online - Django - Sessões
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Esse é o link do código fluente no Pinterest
Meus links de afiliados:
Melhore seu NETWORKING
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no v.
Ah, se puder, clica na estrela nos meus repositórios pra dá uma força ao meu perfil no GITHUB
Código final da aula:
Aula 40 - Loja Online - Django - Sessões
Sessions
Nessa aula vamos entender um pouco sobre como as sessions funcionam para na próxima aula começar a implementar de fato no projeto.
Sessão é o termo usado para se referir ao tempo que um usuário está navegando em um site.
Como o protocolo
HTTP não tem estado, para associar uma solicitação(
request) a qualquer outra, você precisa uma maneira de armazenar os dados do usuário entre as
solicitações HTTP.
O objetivo é representar o tempo entre a primeira chegada em uma página do site até o momento em que saem do site.
Alguns aspectos devem ser considerados, como por exemplo, tomar precauções para evitar que ocorra sequestros de sessões, para que as sessões não durem para sempre, que expirem, etc.
Sequestros de sessões (
hijacking session) é quando um invasor consegue interceptar a session e se coloca entre usuário e o host.
O
Django fornece suporte completo para sessões
anônimas.
A estrutura da sessão permite armazenar e recuperar dados arbitrários por visitante do site.
As
Sessions armazenam dados no lado do servidor e abstrai o envio e recebimento de
cookies.
Os
cookies contêm um ID de sessão e não os dados em si.
Eles são
armazenados no
browser e o
id da
sessão dá ao browser uma
marca única.
Quem lida com a
criação e
destruição de
sessões é o
middleware do
django que temos na nossa aplicação, veja no
settings.py.
O ID da sessão é um número aleatório gigante.
Através desse número, o servidor sabe quais as sessões ativas no momento.
Sessions no contexto do e-commerce
Nós iremos usar
sessions para personalizar a experiência do usuário.
Por exemplo, imagine que um usuário entre no site do seu e-commerce pesquise alguns produtos, mesmo sem estar logado, e adicione alguns deles ao carrinho.
Ele pode nem ter percebido que não estava logado por exemplo, e aí, se ele acessar um outro site na mesma aba, ou se ele sem querer fecha o navegador, ou apertar o F5, ou ainda, se ele não quiser fechar a compra naquele momento, enfim, quando entrar no carrinho novamente, vai estar vazio porque o
HTTP não tem estado.
Isso causa um aborrecimento ao usuário, ele vai ter que pesquisar de novo os produtos e adicionar ao carrinho, e isso não é tão legal.
O que se deseja é que o usuário, estando logado ou não, possa ter o estado do seu carrinho a salvo, para não ter que repetir o processo todo novamente.
Para evitar esses tipos de situações, vamos usar o recurso das
sessions.
Por padrão as
sessions são guardadas no banco de dados, mas, podemos armazenar em
coockies também.
As sessões não podem durar eternamente, elas expiram, e somos nós desenvolvedores que definimos isso.
Quando as
sessions são para quardar estados muito grandes, usar
coockie não é o indicado, porque vai deixar o site mais lento ao carregar.
Então, quando temos que guardar muitas informações, um estado com muitos dados, a melhor opção é usar o padrão das
sessions, que é guardar no banco.
Sessions na prática
Vamos fazer uma experiência, abra o
django_ecommerce/carts/views.py
Vamos colocar um print no
request.session.
Com o servidor rodando, veja o resultado do print no terminal.
Acesse a rota:
django_ecommerce/carts/views.py
from django.shortcuts import render
def cart_home(request):
print(request.session)
return render(request, "carts/home.html", {} )
O mostra que temos um
object dentro da
session.
django_ecommerce/carts/views.py
from django.shortcuts import render
def cart_home(request):
print(dir(request.session))
return render(request, "carts/home.html", {} )
Agora, a
saída do
print nos mostra os
métodos disponíveis em objetos
session.
django_ecommerce/carts/views.py
from django.shortcuts import render
def cart_home(request):
key = request.session.session_key
print(key)
return render(request, "carts/home.html", {} )
Vai imprimir
None.
Faça o login no painel admin e dê um refresh na página
Cart.
Agora veja que temos uma
key da
session.
Vamos a outro experimento.
django_ecommerce/carts/views.py
from django.shortcuts import render
def cart_home(request):
request.session['first_name'] = 'Toti'
return render(request, "carts/home.html", {} )
Agora na
django_ecommerce/e_commerce/views.py
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.http import HttpResponse
from django.shortcuts import render, redirect
from .forms import ContactForm, LoginForm, RegisterForm
def home_page(request):
print(request.session.get('first_name', 'Unknow'))
print(request.session.get(first_name))
context = {
"title": "Home Page",
"content": "Bem vindo a Home Page",
}
if request.user.is_authenticated:
context["premium_content"] = "Você é um usuário Premium"
return render(request, "home_page.html", context)
def about_page(request):
context = {
"title": "Página Sobre",
"content": "Bem vindo a página sobre"
}
return render(request, "about/view.html", context)
def contact_page(request):
contact_form = ContactForm(request.POST or None)
context = {
"title": "Página de Contato",
"content": "Bem vindo a página de contato",
"form": contact_form
}
if contact_form.is_valid():
print(contact_form.cleaned_data)
return render(request, "contact/view.html", context)
def login_page(request):
form = LoginForm(request.POST or None)
context = {
"form": form
}
print("User logged in")
print(request.user.is_authenticated)
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request, username=username, password=password)
print(user)
print(request.user.is_authenticated)
if user is not None:
print(request.user.is_authenticated)
login(request, user)
print("Login válido")
print(request.user.is_authenticated)
# Redireciona para uma página de sucesso.
return redirect("/")
else:
#Retorna uma mensagem de erro de 'invalid login'.
print("Login inválido")
return render(request, "auth/login.html", context)
def logout_page(request):
context = {
"content": "Você efetuou o logout com sucesso! :)"
}
logout(request)
return render(request, "auth/logout.html", context)
User = get_user_model()
def register_page(request):
form = RegisterForm(request.POST or None)
context = {
"form": form
}
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
email = form.cleaned_data.get("email")
password = form.cleaned_data.get("password")
new_user = User.objects.create_user(username, email, password)
print(new_user)
return render(request, "auth/register.html", context)
Acesse a rota home:
No meu caso vai imprimir no console do servidor "
Toti" já que eu defini:
request.session['first_name'] = 'Toti'
Só que vamos mudar o
django_ecommerce/carts/views.py, e ao invés de
first_name, vamos usar
cart_id, que é como geralmente se usa.
django_ecommerce/carts/views.py
from django.shortcuts import render
def cart_home(request):
request.session['cart_id'] = 123
request.session['user'] = request.user.username
return render(request, "carts/home.html", {} )
Note que em
request.session['user'] = request.user.username estamos pegando o
username do objeto
user.
Se a gente deixasse só o
request.user sem o
username, dá erro do tipo:
is not JSON serializable
Ele não deixa salvar o objeto
user em si, apenas os atributos dele, como
id,
username, ou seja, só deixa salvar, um
int, uma
string, um
dicionário, uma
lista, etc.
É isso pessoal, nos vemos na próxima!
Código final da aula:
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Novamente deixo meus link de afiliados:
Obrigado, até a próxima e bons estudos. ;)