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:
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:
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:
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!