Skip to content
Advertisement

werkzeug.routing.BuildError: Could not build url for endpoint ‘profile’. Did you mean ‘index’ instead?

I’m new to programming and I’m following this tutorial: https://www.youtube.com/watch?v=SUC1aTu092w&ab_channel=edureka%21 | I’m trying to make a login system using flask and MySQLdb and I’ve run into this problem, I’m so confused. There’s nothing wrong with the database, I’ve checked multiple times. I’m using VS code. Error: werkzeug.routing.BuildError: Could not build url for endpoint ‘profile’. Did you mean ‘index’ instead?

app.py




from flask import Flask, render_template, request, redirect, session,  url_for
from flask_mysqldb import MySQL
import MySQLdb

app = Flask(__name__)
app.secret_key = "123456789"

app.config["MYSQL_HOST"] = "localhost"
app.config["MYSQL_USER"] = "root"
app.config["MYSQL_PASSWORD"] = "Root123"
app.config["MYSQL_DB"] = "login"

db = MySQL(app)


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        if 'username' in request.form and 'password' in request.form:
            username = request.form['username']
            password = request.form['password']
            cursor = db.connection.cursor(MySQLdb.cursors.DictCursor)
            cursor.execute("SELECT * FROM logininfo WHERE email= %s AND password= %s", (username,password))
            info = cursor.fetchone()
            if info is not None:
                if info['email'] == username and info['password'] == password:
                    session['loginsuccess'] = True
                    return redirect(url_for('/profile'))
            else:
                return redirect(url_for('index'))

    return render_template("login.html")

    

    @app.route('/new')
    def new_user():
        if request.method == "POST":
            if "one" in request.form and "two" in request.form and "three" in request.form:
                username = request.form['one']
                email = request.form['two']
                password = request.form['three']
                cur = db.connection.cursor(MySQLdb.cursors.DictCursor)
                cur.execute("INSERT INTO login.logininfo(name, password, email)VALUES(%s, %s, %s)", (username, password, email))
                db.connection.commit()
                return redirect(url_for('index'))
        return render_template("register.html")

        @app.route('/new/profile')
        def profile():
            if session['loginsuccess'] == True:
               return render_template("profile.html")
if __name__ == '__app__':
    app.run(debug=True)







login.html:






<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Hello World!</title>
    </head>
    <body>
        <div>
            <form action="" method="post">
                <label>USERNAME</label><br>
                <input name="username" type="email" placeholder="Username"><br><br>
                <label>PASSWORD</label><br>
                <input name="password" type="password" placeholder="Password"><br><br>
                <input type="submit" value="LOGIN"><br><br>
            </form>
        </div>
        <div>
            <form action="/new">
           <label>New Here?</label>
            <input value="Register" type="submit">
        </form>
        </div>
    
    </body>
</html>






register.html




<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Register</title>
    </head>
    <body>
        <div>
            <form method="post">
                <label>NAME:</label><br>
                <input type="text" name="one" id="name"><br><br>
                <label>USERNAME:</label><br>
                <input type="email" name="two" id="username"><br><br>
                <label>PASSWORD:</label><br>
                <input type="password" name="three" id="password"><br><br>
                <input type="submit" value="CREATE USER">
            </form>
        </div>
    </body>
</html>





profile.html






    <!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Profile</title>
    </head>
    <body>
        <form action="/">
            <h1>Login Successful</h1>
            <label>Welcome to your profile</label>
            <button type="submit">LOGOUT</button>
        </form>
    </body>
</html>

 




Advertisement

Answer

Spacing is critical in python. Each line that starts w/ @app.route should start at the far left. Also I fixed your profile route name.

from flask import Flask, render_template, request, redirect, session,  url_for
from flask_mysqldb import MySQL
import MySQLdb

app = Flask(__name__)
app.secret_key = "123456789"

app.config["MYSQL_HOST"] = "localhost"
app.config["MYSQL_USER"] = "root"
app.config["MYSQL_PASSWORD"] = "Root123"
app.config["MYSQL_DB"] = "login"

db = MySQL(app)


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        if 'username' in request.form and 'password' in request.form:
            username = request.form['username']
            password = request.form['password']
            cursor = db.connection.cursor(MySQLdb.cursors.DictCursor)
            cursor.execute("SELECT * FROM logininfo WHERE email= %s AND password= %s", (username,password))
            info = cursor.fetchone()
            if info is not None:
                if info['email'] == username and info['password'] == password:
                    session['loginsuccess'] = True
                    return redirect(url_for('profile'))
            else:
                return redirect(url_for('index'))

    return render_template("login.html")

    
@app.route('/new')
def new_user():
    if request.method == "POST":
        if "one" in request.form and "two" in request.form and "three" in request.form:
            username = request.form['one']
            email = request.form['two']
            password = request.form['three']
            cur = db.connection.cursor(MySQLdb.cursors.DictCursor)
            cur.execute("INSERT INTO login.logininfo(name, password, email)VALUES(%s, %s, %s)", (username, password, email))
            db.connection.commit()
            return redirect(url_for('index'))
    return render_template("register.html")


@app.route('/profile')
def profile():
    if session['loginsuccess'] == True:
        return render_template("profile.html")


if __name__ == '__app__':
    app.run(debug=True)

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement