Tengo mi aplicación Flask, con una función profile a continuación:

@app.route('/profile/')
def profile(username, password):
    return f"<h1>username entered: {username} password entered: {password}</h1>"

También tengo mi función login, que usa login.html como plantilla y redirecciona a profile con username y password.

Aquí está mi función de inicio de sesión:

@app.route('/login/', methods=['POST', 'GET'])
def login():
    if request.method == "GET":
        return render_template('login.html')
    elif request.method == "POST":
        username = request.form['username']
        password = request.form['password']
        print(f'Username: {username}, Password: {password}')
        return redirect(url_for('profile', username=username, password=password))

Aquí está mi archivo index.html (solo la parte del cuerpo)

<h1>Login</h1>
<form action="#" method="POST">
    <label>Username</label>
    <input type="text" name="username">
    <label>Password</label>
    <input type="password" name="password">
    <button>Submit</button>
</form>

Sin embargo, cuando intento iniciar sesión y luego enviar, obtengo un TypeError, que dice que a mi función profile le faltan los dos parámetros. Obtuve mi nombre de usuario y contraseña para imprimir en la terminal, así que sé que mi función de inicio de sesión está funcionando bien. ¿Por qué tiene este error y cómo lo soluciono?

0
dinosauce34 23 ene. 2021 a las 07:20

1 respuesta

La mejor respuesta

Los parámetros de la función de su perfil deben corresponder a los parámetros de la URL. Deberá actualizar la URL así:

@app.route('/profile/<string:username>/<string:password>')
def profile(username, password):
    return f"<h1>username: {username} password entered: {password}</h1>

Un uso más práctico de los parámetros de URL sería, por ejemplo: obtener el perfil de un usuario dado un ID de usuario

@app.route('/profile/<int:userId>', methods=["GET"])
def profile(userId):
    user = getUserById(userId) 
    return f"<h1>username: {user["username"]}. userId: {user["id"]}</h1>

En teoría, la solicitud se vería así: GET /profile/20 y la respuesta: <h1>username: foo. userId: 20</h1>

1
Lawynn Jana 23 ene. 2021 a las 07:57