Debbie
Debbie

Reputation: 969

Flask : Why does not the HTML submit button redirect the page to the target URL?

I'm new to Flask. This is the content of my login.html file:

<html>
    <body>
        <form action="localhost:5000/login" method="POST">
            <p>Enter name : </p>
            <p><input type = "text" name="nm"/></p>
            <p><input type = "submit" value="submit"/></p>
        </form>    
    </body>    
</html>

This is app.py file:

from flask import Flask, redirect, url_for, request  
app = Flask(__name__)  
     
@app.route('/success/<name>')  
def success(name):  
    return "Welcome %s" % name

@app.route('/login', methods = ['POST', 'GET']) 
def login():
    if request.method == 'POST' :
        user = request.form['nm']
        return redirect(url_for('success', name = user))

    else :
        user = request.args.get('nm')
        return redirect(url_for('success', name = user))    
      
if __name__ == "__main__":  
    app.run(debug = True)

When I entered a text in my HTML login form and click the submit it should have redirected to the desired URL but nothing happened.

Edit

After trying with changes suggested by Rogan Josh, i got this error:

File not found

Firefox can’t find the file at /home/hp/flask_practice/{{ url_for('login') }}.

    Check the file name for capitalization or other typing errors.
    Check to see if the file was moved, renamed or deleted.

Upvotes: 0

Views: 1370

Answers (1)

roganjosh
roganjosh

Reputation: 13175

Your code can't do anything because you haven't actually served the html from your flask application. You've just double-clicked it and opened the HTML in a browser.

Your html file needs to go in a subdirectory from app.py called "templates". Then change your code to:

from flask import Flask, redirect, url_for, request, render_template  
app = Flask(__name__)  
     
@app.route('/success/<name>')  
def success(name):  
    return "Welcome %s" % name

@app.route('/login', methods = ['POST', 'GET']) 
def login():
    if request.method == 'POST' :
        user = request.form['nm']
        return redirect(url_for('success', name = user))

    else :
        user = request.args.get('nm') # THIS DOES NOTHING
        return render_template('login.html')  # CHANGED HERE  
      
if __name__ == "__main__":  
    app.run(debug = True)

You should also update your HTML to:

<html>
    <body>
        <form action="{{ url_for('login') }}" method="POST">
            <p>Enter name : </p>
            <p><input type = "text" name="nm"/></p>
            <p><input type = "submit" value="submit"/></p>
        </form>    
    </body>    
</html>

Now open the browser and go to 127.0.0.1:5000/login

Upvotes: 1

Related Questions