1
resposta

Method configurado como POST no form, mas chega uma requisição GET no Flask

Olá. Estou seguindo o "Mãos na massa: autorização de usuários" da aula 06. Quando tento acessar a página novo, sou redirecionado para a página de login, faço o login com sucesso e a página novo é exibida. Acompanhado o console, vejo que o Flask recebe a requisição POST, como está configurado no formulário da página de login.

Quando tento fazer o login diretamente, assim que rodo a aplicação, quando envio os dados de login para a rota '/autenticar' aparece a tela de erro "Method Not allowed". Quando mudo a rota para '/novo', por exemplo, a página novo é exibida e aparece a mensagem de que o usuário foi logado com sucesso. Vejo no terminal que foi enviada uma requisição GET para o Flask. Não sei o que está acontecendo. Pode me ajudar? Segue os prints do código e do console.

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

@app.route('/login')
def login():
    proxima = request.args.get('proxima')
    return render_template('login.html', proxima=proxima)

@app.route('/autenticar', methods=['POST',])
def autenticar():
    if 'mestra' == request.form['senha']:
        session['usuario_logado'] = request.form['usuario']
        flash(request.form['usuario'] + ' logou com sucesso!')
        proxima_pagina = request.form['proxima']
        return redirect('/{}'.format(proxima_pagina))
    else:
        flash('Não logado, tente novamente!')
        return redirect('/login')

Em login.html temos:

<h1>Faça seu login</h1>
        <form method="POST" action="/autenticar">
            <input type="hidden" name="proxima" value="{{ proxima or '/' }}">
            <p><label>Nome de usuário:</label> <input class="form-control" type="text" name="usuario" required></p>
            <p><label>Senha:</label> <input class="form-control" type="password" name="senha" required></p>
            <p><button class="btn btn-primary" type="submit">Entrar</button></p>
        </form>

Quando rodo a aplicação do início e vou para a rota de login, as mensagens no console que aparecem na sequência são as seguintes:

127.0.0.1 - - [28/Jun/2021 00:58:11] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [28/Jun/2021 00:58:22] "GET /login HTTP/1.1" 200 -
127.0.0.1 - - [28/Jun/2021 00:58:35] "POST /autenticar HTTP/1.1" 302 -
127.0.0.1 - - [28/Jun/2021 00:58:35] "GET /autenticar HTTP/1.1" 405 -

É como se tívessemos duas requisições em seguida, uma POST (ao que parece o usuário é logado na sessão) e uma GET (aparece o erro no navegador "Method not allowed"). Mas é só mudar a rota, por exemplo, para '/novo' ou '/' que a página é exibida e aparece a mensagem flash informando que o usuário foi logado.

Tomara que consigam me ajudar. Agradeço.

1 resposta

Olá Ana, tudo bem com você?

Peço desculpas pela demora no retorno.

Gostaria de saber se o erro ainda está presente.

A mensagem de erro apresentada, "Method not allowed", está sendo levantada devido à tentativa de acesso usando uma requisição do tipo GET a rota '/autenticar'.

Realizando algumas simulações com o código apresentado e seguindo a rota citada, acessando a página de login e enviando os dados para autenticação, o método do tipo POST permaneceu sendo enviado de forma correta e realizando o login do usuário cadastrado.

Peço que reinicie o servidor e realize nova tentativa de acesso à rota /login com um usuário não cadastrado, informando suas credenciais.

Caso o erro permaneça, peço que siga a implementação das rotas usando a função url_for do Flask, na próxima aula, Mais URLs dinâmicas o instrutor irá realizar uma refatoração do código usando a função url_for, com o objetivo de remover erros de redirecionamento e de rodas.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

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