CodeToLive

Flask Forms & Validation

Handling form data is a common task in web applications. Flask provides tools to process form data securely.

Basic Form Handling


from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        # Process login
    return render_template('login.html')
            

WTForms Integration


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Login')
            

Form Rendering


<form method="POST" action="">
    {{ form.hidden_tag() }}
    <div>
        {{ form.email.label }} {{ form.email() }}
        {% for error in form.email.errors %}
            <span style="color: red;">[{{ error }}]</span>
        {% endfor %}
    </div>
    <div>
        {{ form.password.label }} {{ form.password() }}
    </div>
    {{ form.submit() }}
</form>
            

CSRF Protection


app.config['SECRET_KEY'] = 'your-secret-key'
            

File Uploads


from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            

Form Validation


@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        # Process valid form
        return redirect(url_for('login'))
    return render_template('register.html', form=form)
            

Flash Messages


from flask import flash

@app.route('/login', methods=['GET', 'POST'])
def login():
    # ... login logic ...
    flash('Invalid username or password', 'error')
    return render_template('login.html')
            

{% with messages = get_flashed_messages(with_categories=true) %}
    {% if messages %}
        {% for category, message in messages %}
            <div class="alert alert-{{ category }}">{{ message }}</div>
        {% endfor %}
    {% endif %}
{% endwith %}
            
Next: Database Integration