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

Erro de redirecionamento após o login

Olá, tudo bem?

Estou com a mesma dúvida que do Guilherme sobre o erro:

werkzeug.routing.BuildError: Could not build url for endpoint '/novo'. Did you mean 'novo' instead?

Eu entendi que o problema se encontro em passar '/novo' para o url_for (que é o valor da variável proxima_pagina). Como podemos ver no trecho abaixo:

@app.route('/autenticar', methods=['POST',])
def autenticar():
    if 'mestra' == request.form['senha']:
        session['usuario_logado'] = request.form['usuario']
        flash(request.form['usuario'] + ' logado com sucesso!')
        proxima_pagina = request.form['proxima']
        return redirect(url_for(proxima_pagina))
    else:
        flash('Usuário ou senha incorretos. Por favor, tente novamente.')
        return redirect(url_for('login'))

Minha dúvida é: por que não deu erro na vídeo-aula? Teria sido a versão do flask? O professor esqueceu de salvar as alterações?

7 respostas

Estou tendo problemas neste trecho também, porém, eu estou conseguindo o código 404 porque o servidor tenta acessar o URL - > "/ /novo" inclusive o espaço que vem de algum lugar que não identifiquei

confere antes se foi possível pra você acessar utilizando no lugar do parâmetro proxima, o valor "novo" ao invés de "/novo". Me parece que o seu caso seria esse o problema

@app.route("/novo")
def novo():
    if "usuario_logado" not in session or session["usuario_logado"] == None:
        return redirect(url_for('login', proxima=url_for("novo")))
    return render_template("novo.html", titulo="Novo Jogo")

Pra ser mais preciso, realizei um teste mandando imprimir o valor que estava sendo recuperado ao usar o comando da seguinte maneira:

    proxima_pagina = request.form["proxima"]
    print("Valor de proxima pagina é:"+proxima_pagina)
    return redirect(proxima_pagina)

o output que consegui com este print foi o seguinte:

127.0.0.1 - - [12/Jan/2020 22:29:36] "GET /login?proxima=%2Fnovo HTTP/1.1" 200 -

127.0.0.1 - - [12/Jan/2020 22:29:42] "POST /autenticar HTTP/1.1" 302 -

Valor de proxima pagina é: /novo

127.0.0.1 - - [12/Jan/2020 22:29:42] "GET /%20/novo HTTP/1.1" 404 -

Nota-se que a variável realmente está contendo um valor de " /novo"

Srs, descobri o meu caso, o problema era no html de login, eu estava adicionando um espaço no parametro value do hidden input, antes dos caracteres {{

Correto:

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

Incorreto

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

Rodrigo ainda aguardo saber se a solução do seu caso é a descrita anteriormente

Estou tendo o mesmo problema do Rodrigo, tentei a solução do Breno e não resolveu. Alguma outra ideia?

José, consegue colocar algum print pra verificar o valor da variável próxima_pagina?

Algo deste jeito:

    proxima_pagina = request.form["proxima"]
     print("Valor de proxima pagina é:"+proxima_pagina)

Isso pode te ajudar a entender se o seu problema é relacionado ao valor da variável e ao caminho que o flask tenta acessar

Consegui resolver. o código que eu estava inserindo era:

@app.route('/autenticar', methods = ['Post',])
def autenticar():
    if request.form['usuario'] in usuarios:
        usuario = usuarios[request.form['usuario']]
        if usuario.senha == request.form['senha']:
            session['usuario_logado'] = usuario.id
            flash(usuario.nome + ' logou com sucesso!')
            proxima_pagina = request.form['proxima']
            return redirect(url_for(proxima_pagina))
    else:
        flash('Não logado, tente novamente.')
        return redirect(url_for('login'))

o que eu fiz foi alternar o método return, tirando o 'url_for'


            return redirect(proxima_pagina)

solução!

Isso é uma solução, mas a alteração sugerida pelo professor no vídeo, visa deixar o código mais estável à medida que mudanças possam ser feitas nos diretórios. Usando o url_for você consegue deixar estes caminhos bem mais dinâmicos.

Embora a mudança que você tenha feito permita que você continue o curso sem problemas, a experiência de debugar o seu problema e atacar os pontos que foram alterados no processo de "usar o url_for pra tudo" é muito interessante pra que você possa encontrar o real motivo dos problemas. no meu caso, tive que examinar todos os valores das variáveis pra me certificar que o uso delas estava correto, e no fim das contas o problema era o trecho que eu estava ignorando lá no html.

Enfim, boa sorte e continue assim!

No meu html não havia o espaço que vc relatou. Resolvi o problema de um jeito diferente do José. Segue o código que me bastou para a solução:

@app.route('/novo')
def novo():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima='novo'))
    return render_template('novo.html', titulo='Novo Jogo')

Eu removi o url_for() do parâmetro proxima da função redirect(). Eu entendi seu ponto sobre a estabilidade de código, vou reverter minha mudança ao final do curso pra debugar o meu problema. De qualquer forma obrigado pelas dicas.