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