Flask-WTF helps you check if the information users type in forms is correct and safe. It makes handling forms easier and more secure.
Flask-WTF for form validation
from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Email, Length class MyForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6)]) submit = SubmitField('Submit')
FlaskForm is the base class for creating forms.
Validators check if the input meets rules like being filled or having a valid email format.
from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import DataRequired class SimpleForm(FlaskForm): name = StringField('Name', validators=[DataRequired()])
from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Email class EmailForm(FlaskForm): email = StringField('Email', validators=[Email()])
from flask_wtf import FlaskForm from wtforms import PasswordField from wtforms.validators import Length class PasswordForm(FlaskForm): password = PasswordField('Password', validators=[Length(min=8)])
This Flask app shows a login form with email and password fields. It checks if the email is valid and the password is at least 6 characters. If the form is correct, it shows a success message.
from flask import Flask, render_template_string, request from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Email, Length app = Flask(__name__) app.config['SECRET_KEY'] = 'secret123' class LoginForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6)]) submit = SubmitField('Login') form_html = ''' <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Login</title> </head> <body> <h1>Login Form</h1> <form method="POST"> {{ form.hidden_tag() }} <p> {{ form.email.label }}<br> {{ form.email(size=32) }}<br> {% for error in form.email.errors %} <span style="color: red;">{{ error }}</span><br> {% endfor %} </p> <p> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color: red;">{{ error }}</span><br> {% endfor %} </p> <p>{{ form.submit() }}</p> </form> {% if success %} <p style="color: green;">Login successful for {{ email }}!</p> {% endif %} </body> </html> ''' @app.route('/', methods=['GET', 'POST']) def login(): form = LoginForm() success = False email = '' if form.validate_on_submit(): email = form.email.data success = True return render_template_string(form_html, form=form, success=success, email=email) if __name__ == '__main__': app.run(debug=True)
Always set a secret key in your Flask app to protect forms from CSRF attacks.
Use validate_on_submit() to check if the form was submitted and is valid in one step.
Flask-WTF automatically adds a hidden CSRF token field to your forms for security.
Flask-WTF makes form handling and validation simple and secure in Flask apps.
Use validators to check user input like required fields, email format, and length.
Show helpful error messages and protect forms from attacks easily.
Practice
Solution
Step 1: Understand Flask-WTF role
Flask-WTF is a Flask extension that helps create forms and validate user input easily and securely.Step 2: Compare options with Flask-WTF purpose
Options A, B, and D relate to other Flask features or extensions, not form validation.Final Answer:
To simplify form creation and add validation easily -> Option AQuick Check:
Flask-WTF = form handling and validation [OK]
- Confusing Flask-WTF with database or auth tools
- Thinking Flask-WTF serves static files
- Assuming Flask-WTF manages sessions
Solution
Step 1: Recall Flask-WTF import syntax
The FlaskForm class is imported directly from the flask_wtf package using 'from flask_wtf import FlaskForm'.Step 2: Check other options for syntax errors or wrong paths
from flask import FlaskForm imports from flask (wrong package). import FlaskForm from flask_wtf uses invalid syntax. from flask_wtf.forms import FlaskForm imports from a non-existent submodule.Final Answer:
from flask_wtf import FlaskForm -> Option AQuick Check:
Correct import = from flask_wtf import FlaskForm [OK]
- Importing FlaskForm from flask instead of flask_wtf
- Using incorrect import syntax like 'import X from Y'
- Assuming FlaskForm is in a submodule
form.validate_on_submit() return if the submitted email is empty?from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Email
class EmailForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])Solution
Step 1: Understand validators on email field
The email field uses DataRequired() which means it must not be empty, and Email() to check format.Step 2: Analyze validate_on_submit() behavior with empty email
Since email is empty, DataRequired() fails, so validate_on_submit() returns False.Final Answer:
False, because the email field is empty and required -> Option DQuick Check:
Empty required field = validation fails [OK]
- Assuming empty fields pass Email validator
- Thinking form submission means validation is True
- Expecting exceptions instead of False return
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import Length
class NameForm(FlaskForm):
name = StringField('Name', validators=Length(min=3, max=25))Solution
Step 1: Check validators argument type
Validators must be passed as a list or tuple, even if only one validator is used.Step 2: Identify the error in code
Here, validators=Length(...) passes a single instance, not a list, causing a TypeError.Final Answer:
validators should be a list, not a single Length instance -> Option CQuick Check:
Validators must be in a list [OK]
- Passing a single validator without list brackets
- Thinking validators argument is optional
- Importing FlaskForm from wrong package
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Length, Email, Optional
class UserForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=4, max=12)])
email = StringField('Email', validators=[???])Solution
Step 1: Understand optional email validation
Email is optional, so Optional() must come before Email() to allow empty input without error.Step 2: Check validator order and correctness
[Optional(), Email()] correctly uses [Optional(), Email()] so empty email passes, and if present, Email() validates format.Final Answer:
[Optional(), Email()] -> Option BQuick Check:
Optional before Email for optional valid email [OK]
- Using DataRequired() on optional fields
- Reversing order of Optional() and Email()
- Using Length validator on email field
Ready to prove it?
Pass the test and this pattern moves unknown
