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.