Basic Form Handling
Handle form submissions:
from flask import Flask, request, render_template
@app.route('/contact', methods=['GET', 'POST'])
def contact():
if request.method == 'POST':
name = request.form.get('name')
email = request.form.get('email')
message = request.form.get('message')
# Process form data
# Save to database, send email, etc.
return 'Form submitted!'
return render_template('contact.html')
Using WTForms
Use WTForms for better form handling:
from flask_wtf import FlaskForm
from wtforms import StringField, EmailField, TextAreaField, SubmitField
from wtforms.validators import DataRequired, Email
class ContactForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
email = EmailField('Email', validators=[DataRequired(), Email()])
message = TextAreaField('Message', validators=[DataRequired()])
submit = SubmitField('Submit')
Rendering Forms
Display forms in templates:
<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name() }}
{{ form.email.label }} {{ form.email() }}
{{ form.message.label }} {{ form.message() }}
{{ form.submit() }}
</form>
Form Validation
Validate form data:
@app.route('/contact', methods=['GET', 'POST'])
def contact():
form = ContactForm()
if form.validate_on_submit():
# Form is valid
name = form.name.data
email = form.email.data
# Process data
return redirect('/success')
return render_template('contact.html', form=form)
CSRF Protection
Enable CSRF protection:
# In app.py
app.config['SECRET_KEY'] = 'your-secret-key'
# In template
<form method="POST">
{{ form.hidden_tag() }} # Includes CSRF token
...
</form>
Best Practices
- Always validate: Never trust user input
- Use WTForms: Easier validation and rendering
- Enable CSRF: Protect against cross-site attacks
- Sanitize input: Clean user data before processing
Next Steps
Learn about templates for rendering forms, or explore database integration.