Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Olá, gostaria de solicitar a correção da resposta correta de Flask

Na rota: https://cursos.alura.com.br/course/flask-rotas-templates-autenticacao/task/33426 Aula Flask parte 1: Crie uma webapp com Python 3 Aula 06 Implementando autorização para criar Jogos, a primeira pergunta após o vídeo esta com a resposta errada A resposta que esta como correta é essa:

@app.route('/criar-receita')
def novo():
    if 'nome_usuario' not in session or session['nome_usuario'] is None:
        # não está logado
        return redirect('/login')
    return render_template('criar-receita.html')

porém, a linha do if esta errada, não é:

if 'nome_usuario' not in session or session['nome_usuario'] is None:

e sim:

if 'nome_usuario' not in session or session['nome_usuario'] == None:

2 respostas

Os dois modos funcionam. Desculpem

solução!

Oi Rafael! Tudo bem contigo?

Realmente, nesse caso, tanto o "is" quanto o "==" funcionam. Mas existem diferenças na utilização deles.

O "==" é utilizado para comparar o conteúdo do objeto, enquanto o " is " compara a identidade do objeto, ou seja, o valor de referência de seu endereço na memória, não o valor que atribuímos a variável.

Para entender isso melhor, vamos atribuir a duas variáveis (a e b) uma mesma string e utilizar o is para compará-las:

Imagem do Google Colab com a definição das variáveis a e b e utilizando o "is" para compará-las. Após executada a célula temos o retorno False. O código aqui utilizado se encontra no final do tópico

Observe que dessa forma temos o retorno sendo False. E isso ocorre justamente porque, mesmo se tratando da mesma string, essas duas variáveis possuem diferentes endereços de memória. Para verificarmos se o endereço delas é realmente diferente, podemos utilizar o método id:

Imagem do Google Colab com a definição das variáveis a e b e utilizando o método "id" para visualizar os endereços das respectivas variáveis. Após executada a célula temos como retorno os endereços das variáveis a e b, sendo esses diferentes entre si. O código aqui utilizado se encontra no final do tópico

Pronto! Assim conseguimos conferir que realmente elas possuem diferentes endereços e por isso que o is retorna False.

Agora, vamos usar o == para comparar se o conteúdo armazenado nessas variáveis é o mesmo:

Imagem do Google Colab com a definição das variáveis a e b e utilizando o "==" para compará-las. Após executada a célula temos o retorno True. O código aqui utilizado se encontra no final do tópico

E temos o retorno True, informando que realmente essas variáveis possuem valores iguais.

No seu caso, quando você faz session['nome_usuario'] is None ele resulta em True, porque você basicamente está dizendo None is None e o None sempre vai possuir o mesmo endereço de memória. E quando você faz session['nome_usuario'] == None ele também retorna True porque None == None também é uma condição verdadeira.

Caso queira entender com mais detalhes sobre a diferença entre is e ==, sugiro a leitura desse artigo que temos aqui na Alura:

Vou deixar aqui listado os códigos que utilizei nas imagens acima, caso queira testá-los:

a = 'Ana Maria'
b = 'Ana Maria'

# verificando se possuem o mesmo endereço de memória
print(a is b)

# verificando o endereço de memória de cada variável
print(id(a))
print(id(b))

# verificando se possuem o mesmo conteúdo armazenado
print(a == b)

Espero que tenha te ajudado! Qualquer dúvida é só avisar :)

Bons estudos!