Skip to content

Handling Form Data

HTML forms usually submit data using POST with a content type like:

  • application/x-www-form-urlencodedapplication/x-www-form-urlencoded
  • multipart/form-datamultipart/form-data (required for file uploads)

Minimal example (no Flask-WTF yet)

Template templates/contact.htmltemplates/contact.html:

<form method="post">
  <input type="text" name="name" placeholder="Your name" />
  <input type="email" name="email" placeholder="Email" />
  <button type="submit">Send</button>
</form>
<form method="post">
  <input type="text" name="name" placeholder="Your name" />
  <input type="email" name="email" placeholder="Email" />
  <button type="submit">Send</button>
</form>

Route:

from flask import Flask, request, render_template
 
app = Flask(__name__)
 
 
@app.route("/contact", methods=["GET", "POST"])
def contact():
    if request.method == "POST":
        name = request.form.get("name", "")
        email = request.form.get("email", "")
 
        # TODO: validate input here
        return f"Thanks {name}, we received {email}!"
 
    return render_template("contact.html")
from flask import Flask, request, render_template
 
app = Flask(__name__)
 
 
@app.route("/contact", methods=["GET", "POST"])
def contact():
    if request.method == "POST":
        name = request.form.get("name", "")
        email = request.form.get("email", "")
 
        # TODO: validate input here
        return f"Thanks {name}, we received {email}!"
 
    return render_template("contact.html")

Common pitfalls

  • Missing methods=["GET", "POST"]methods=["GET", "POST"] โ†’ POST returns 405
  • Forgetting to validate user input
  • Returning a success page directly after POST (refresh resubmits)

Best practice: PRG pattern

After a successful POST:

  • save/process data
  • redirect()redirect() to a GET route

This prevents double submission on refresh.

๐Ÿงช Try It Yourself

Exercise 1 โ€“ Create a Flask App

Exercise 2 โ€“ Dynamic Route

Exercise 3 โ€“ Return JSON

If this helped you, consider buying me a coffee โ˜•

Buy me a coffee

Was this page helpful?

Let us know how we did