Aula 40 – Loja Online – Django – Sessões

Aula 40 – Loja Online – Django – Sessões

sessões no django

sessões

Voltar para página principal do blog

Todas as aulas desse curso

Aula 39               Aula 41

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:

Hostinger

Digital Ocean

One.com

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:

https://github.com/toticavalcanti

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:

http://127.0.0.1:8000/cart

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:

http://127.0.0.1:8000

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!

Aula 39               Aula 41

Todas as aulas desse curso

Voltar para página principal do blog

Código final da aula:

https://github.com/toticavalcanti

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:

Hostinger

Digital Ocean

One.com

Obrigado, até a próxima e bons estudos. 😉

 

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>