Handling Form Data
HTML forms usually submit data using POST with a content type like:
application/x-www-form-urlencodedapplication/x-www-form-urlencodedmultipart/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 coffeeWas this page helpful?
Let us know how we did
