Skip to content

Working with Forms in Flask: Handling User Input

5 min read

1. Introduction to Forms in Flask

Flask is a micro web framework written in Python that allows you to build web applications quickly and easily. One of the most common tasks when building web applications is handling user input through forms. Forms are an essential part of many applications as they allow users to send data to the server, whether it’s to sign up, login, or submit feedback.

This tutorial will guide you through handling user input in Flask, from creating a simple form to processing and validating the data entered by users. We’ll also explore best practices to ensure your application handles forms securely and efficiently.


2. Setting Up Your Flask Application

Note: The steps for setting up your Flask application are already covered in the tutorial Introduction to Flask: Building Your First Web Application. Please refer to that tutorial for detailed instructions on setting up Flask, installing dependencies, and creating the basic structure of a Flask app.


3. Creating a Simple Form

In this step, we will create a simple HTML form that users can interact with. Forms in Flask are usually rendered using HTML templates.

Creating the HTML Form

Inside your project directory, create a folder called templates and create a file called form.html inside it:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Simple Flask Form</title>
</head>
<body>
    <h1>Simple User Input Form</h1>
    <form action="/" method="POST">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" required><br><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

This form contains fields for a username and email, and when submitted, it sends a POST request to the same route ('/').


4. Handling Form Data

Now that we have the form in place, let’s learn how to handle the user input when the form is submitted.

Processing the Data in Flask

In the app.py file, modify the home route to handle both GET and POST methods. When the form is submitted, we’ll extract the data and display a message to the user.

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST':
        username = request.form['username']
        email = request.form['email']
        return f'Hello, {username}! Your email is {email}.'
    return render_template('form.html')

if __name__ == '__main__':
    app.run(debug=True)

In this code, we use request.form to access the data submitted by the form. If the request method is POST, we extract the username and email, then return a simple message containing that data.


5. Validating User Input

User input needs to be validated to ensure it’s correct and secure. Flask itself doesn’t offer built-in validation, but you can handle validation in Python easily.

Validating Input

Let’s modify the form handler to validate that the fields are not empty and the email is properly formatted.

from flask import Flask, render_template, request, flash

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # Required for flashing messages

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST':
        username = request.form['username']
        email = request.form['email']

        # Check if the username or email is empty
        if not username or not email:
            flash('Both fields are required!', 'error')
            return render_template('form.html')

        # Check if the email format is valid
        if '@' not in email:
            flash('Please enter a valid email address.', 'error')
            return render_template('form.html')

        return f'Hello, {username}! Your email is {email}.'
    return render_template('form.html')

if __name__ == '__main__':
    app.run(debug=True)

In this code, we use flash() to display error messages to the user if the input is invalid. The secret_key is necessary for using flash() to display messages.


6. Best Practices for Working with Forms in Flask

Working with forms involves more than just processing user input. Here are some best practices to keep in mind:

Use Flask-WTF for Form Handling

Flask-WTF is an extension for Flask that simplifies form handling, including validation and CSRF protection. Consider using it for larger projects.

Install Flask-WTF:

pip install Flask-WTF

Then, you can define forms as Python classes with built-in validation.

Protect Against CSRF

Always ensure that your forms are protected from Cross-Site Request Forgery (CSRF) attacks. Flask-WTF helps with this by adding a CSRF token to your forms automatically.

Keep Data Secure

Always sanitize user input to avoid security vulnerabilities like SQL injection and XSS attacks. Flask provides tools to help with this, but you should always be cautious when handling user-generated data.


Conclusion

Handling forms in Flask is an essential skill for building interactive web applications. By following the steps in this tutorial, you’ve learned how to create a basic form, process user input, and validate the data. Flask offers a lot of flexibility, so you can extend this tutorial by adding more complex forms, using Flask-WTF for form management, and ensuring security.

If you’d like to dive deeper into working with forms in Flask, consider exploring additional resources like Flask-WTF for more advanced features such as form validation and file uploads.


Note: Please refer to the Introduction to Flask: Building Your First Web Application tutorial for detailed instructions on setting up your Flask application.

Leave a Reply

Your email address will not be published. Required fields are marked *

×