3
respostas

%20 na linha URL

Bom dia

estou com uma duvida, percebi que quando faço a autenticação aparece um %20 impossibilitando de retornar para a pagina de cadastro, tentei resolver mais não consegui ainda, alguém pode me ajudar ?

vou inserir o codigo para vocês

Python

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

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

jogo1 = Jogo('Tetris', 'Puzzle', 'Atari')
jogo2 = Jogo('God of War', 'Hack n Slash', 'PS2')
jogo3 = Jogo('Mortal Kombat', 'Luta', 'PS2')
lista = [jogo1, jogo2, jogo3]

class Usuario:
    def __init__(self, nome, nickname, senha):
        self.nome = nome
        self.nickname = nickname
        self.senha = senha

usuario1 = Usuario("Bruno Divino", "BD", "alohomora")
usuario2 = Usuario("Camila Ferreira", "Mila", "paozinho")
usuario3 = Usuario("Guilherme Louro", "Cake", "Python_eh_vida")

usuarios = { usuario1.nickname : usuario1,
             usuario2.nickname : usuario2,
             usuario3.nickname : usuario3 }

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

@app.route('/')
def index():
    return render_template('lista.html', titulo='Jogos', jogos=lista)

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

@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(url_for('index'))

@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 '123' == request.form['senha']:
        session['usuario_logado'] = request.form['usuario']
        flash(request.form['usuario'] + ' logado com sucesso!')
        proxima_pagina = request.form['proxima']
        return redirect(proxima_pagina)
    else:
        flash('Usuário não logado.')
        return redirect(url_for('login'))

@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    flash('Logout efetuado com sucesso!')
    return redirect(url_for('index'))

app.run(debug=True)

HTML - Login

<!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="{{ url_for('autenticar')}}">
            <input type="hidden" name="proxima" value=" {{ proxima or url_for('index') }}">
            <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>
3 respostas

Olá Fernando! Tudo certo? Espero que sim. 🙂

Teria como você enviar um print da mensagem de erro que surge ao tentar retornar à página de login? Assim vou conseguir me contextualizar melhor e te ajudar com situação.

Aguardo o retorno. 😉

Ola Bruno

na vdd ele não da erro, mas simplesmente não carrega, por que na URL aparece %20/novo, ai nao carrega, acredito ser por conta desses %20 que aparece antes, por que quando apago, entra de boas

Olá Fernando!!!

Acredito que encontrei o erro que gera esse %20.

Primeiramente, segundo a nomenclatura das query strings, o %20 é o equivalente do caractere espaço (" "). Dessa forma, isso indica que em algum momento do código existe um caractere espaço poluindo o caminho seguido pelo url_for('novo').

O caractere espaço se encontra no arquivo login.html:

...

        <h1>Faça seu login</h1>
        <form method="POST" action="{{ url_for('autenticar')}}">
            <input type="hidden" name="proxima" value=" {{ proxima or url_for('index') }}">
                                                      ^        
            <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>

O problema está na definição do value do input proxima. Onde o código deve ser value="{{ proxima or url_for('index') }}" e não value=" {{ proxima or url_for('index') }}".

Espero ter ajudado! Quaisquer dúvidas, estou à disposição. 😉

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