1
resposta

Ao fazer login sou enviado para uma página "not found": http://127.0.0.1:5000/None

Quando primeiramente vou em 'Novo jogo' e faço login, da tudo certo e sou enviado para página "/novo", mas quando faço login pelo caminho normal de login sou enviado para "/None".

Alguém teve esse erro e sabe como corrigir?

# login
@app.route('/login')
def login():
    proxima = request.args.get('proxima')  # query que vem de '/novo'
    form = FormularioUsuario()
    return render_template('login.html', proxima=proxima, form=form)

# novo
@app.route('/novo')
def novo():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        # não está logado
        return redirect(url_for('login', proxima=url_for('novo')))
    # logado
    form = FormularioJogo()
    return render_template('novo.html', titulo='Novo Jogo', form=form)

# autenticar
@app.route('/autenticar', methods=['POST', ])
def autenticar():
    # instanciando formulário wtforms
    form = FormularioUsuario(request.form)
    # autenticando nick
    usuario = Usuarios.query.filter_by(nickname=form.nickname.data).first()
    if usuario:  # verificando se o usuário informado está no dicionario
        if form.senha.data == usuario.senha:
            session['usuario_logado'] = usuario.nickname
            # mensagem
            flash(usuario.nickname + ' logado com sucesso!')
            # redirect
            proxima_pagina = request.form['proxima']
            return redirect(proxima_pagina)
    else:
        # usuário ou senha incorreta
        flash('Usuário ou Senha Incorretos!')
        return redirect(url_for('login'))
1 resposta

Olá Paulo, tudo bem com você?

A mensagem Not Found é apresentada devido à tentativa de acesso a uma URL não declarada. Este comportamento é apresentado devido à variável proxima da rota /login não receber um valor ao acessarmos diretamente a URL /login.

Para que esse erro não seja levantado, basta definirmos uma URL alternativa caso a variável proxima não receba um valor, assim ao acessarmos diretamente a URL /login a variável proxima receberá este valor padrão.

Peço que no arquivo login.html localize a tag input type="hidden". Nessa tag modifique o atributo value, deixando conforme apresentado abaixo:

<input type="hidden" name="proxima" value="{{ proxima or url_for('index') }}">

Assim, caso a variável proxima possua o valor none (fato que ocorre ao acessarmos diretamente a rota /login) o value receberá o url_for('index'). Desta forma, se o usuário acessar diretamente a URL /login será redirecionado a página inicial (index) após o login com sucesso. Como apresentado no GIF abaixo:

GIF Contendo a apresentação do acesso à página de login de uma aplicação Web e retorno após o login com sucesso.

Após a modificação, salve o arquivo login.html, inicie a aplicação e realize um novo login acessando diretamente a URL /login.

Espero ter lhe ajudado. Em caso de dúvidas estou à disposição.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software