1
resposta

Não funciona o acesso referente o direcionamento da página login

Seguindo todos os passos do curso, fiz com que a página "novo" redirecionasse para "login" e que retornasse à página de adicionar um novo jogo após logar, mas quando tento fazer com que retorne á página principal se não vim de nenhuma página, dá o erro "Method Not Allowed", mesmo eu tendo passado "POST" como um método da autenticação.

Aqui estão os códigos "jogoteca.py" e "login.html":

JOGOTECA.PY

from flask import Flask, render_template,request,redirect,session, flash      

app = Flask(__name__)
app.secret_key = 'alura'

class Jogo:
    def __init__(self, nome, categoria, console):
        self.nome = nome
        self.categoria = categoria
        self.console = console

jogo1 = Jogo('Super Mario', 'Ação', 'SNES')
jogo2 = Jogo('Pokemon Gold', 'RPG', 'GBA')
jogo3 = Jogo('Mortal Kombat', 'Luta', 'SNES')
lista = [jogo1, jogo2,jogo3]

@app.route('/')
def ola():
    return render_template('lista.html',titulo='Jogos',
                           jogos=lista) #rendeniza e chama minha página html

@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('/criar',methods=['POST',])
def criar():
    nome = request.form['nome']
    categoria = request.form['categoria']
    console = request.form['console']
    jogo = Jogo(nome,categoria,console)
    lista.append(jogo)
    return redirect('/')


@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')

@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    flash('Nenhum usuário logado!')
    return  redirect('/login')

app.run(debug=True) # Roda minha aplicação.

LOGIN.HTML

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Jogoteca</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='bootstrap.css') }}">
  </head>
  <body>
    <div class="container">
        {% with messages = get_flashed_messages() %}
            {% if messages %}
                <ul id="messages" class="list_unstyled">
                {% for message in messages %}
                    <li class="alert alert-success">{{ message }}</li>
                {% endfor %}
                </ul>
            {% endif %}
        {% endwith %}

        <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>
    </div>
</body>
</html>

Alguém poderia me ajudar a identificar o erro. Desde já obrigado.

1 resposta

Olá, tudo bem? Eu vi aqui rapidamente e nao acabei testando devido meus outros arquivos do projeto ja estarem bem diferente, mas notei que no login.html o input hidden está passando o valor de 'proxima' com aspas duplas, teste com simples, dessa forma:

 <input type="hidden" name="proxima" value="{{ proxima or '/' }}">

Espero que funcione. 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