User Authentication in Flask


Introduction

This article explains how to integrate Flask-Login for user authentication and manage user sessions, including login and logout functionalities.

Step 1: Installing Flask-Login

First, install Flask-Login using pip:

            pip install flask flask-login flask-sqlalchemy
        

Step 2: Setting Up Flask and Database

Set up your Flask application and configure SQLAlchemy:

            from flask import Flask, render_template, redirect, url_for, request, flash
            from flask_sqlalchemy import SQLAlchemy
            from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user

            app = Flask(__name__)
            app.config['SECRET_KEY'] = 'your_secret_key'
            app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
            db = SQLAlchemy(app)
            login_manager = LoginManager(app)
            login_manager.login_view = 'login'
        

Step 3: Creating the User Model

Define a User model that inherits from UserMixin:

            class User(db.Model, UserMixin):
                id = db.Column(db.Integer, primary_key=True)
                username = db.Column(db.String(150), unique=True, nullable=False)
                password = db.Column(db.String(150), nullable=False)
        

Create the database:

            db.create_all()
        

Step 4: Loading Users

Define a user loader function for Flask-Login:

            @login_manager.user_loader
            def load_user(user_id):
                return User.query.get(int(user_id))
        

Step 5: Setting Up the Registration Route

Create a route for user registration:

            @app.route('/register', methods=['GET', 'POST'])
            def register():
                if request.method == 'POST':
                    username = request.form.get('username')
                    password = request.form.get('password')
                    user = User(username=username, password=password)
                    db.session.add(user)
                    db.session.commit()
                    flash('Account created successfully!')
                    return redirect(url_for('login'))
                return '''
                    <form method="POST">
                        Username: <input type="text" name="username"><br>
                        Password: <input type="password" name="password"><br>
                        <button type="submit">Register</button>
                    </form>
                '''
        

Step 6: Setting Up the Login Route

Create a route for user login:

            @app.route('/login', methods=['GET', 'POST'])
            def login():
                if request.method == 'POST':
                    username = request.form.get('username')
                    password = request.form.get('password')
                    user = User.query.filter_by(username=username).first()
                    if user and user.password == password:
                        login_user(user)
                        flash('Login successful!')
                        return redirect(url_for('dashboard'))
                    else:
                        flash('Invalid username or password')
                return '''
                    <form method="POST">
                        Username: <input type="text" name="username"><br>
                        Password: <input type="password" name="password"><br>
                        <button type="submit">Login</button>
                    </form>
                '''
        

Step 7: Creating the Dashboard Route

Create a protected route for logged-in users:

            @app.route('/dashboard')
            @login_required
            def dashboard():
                return f'Welcome, {current_user.username}!'
        

Step 8: Setting Up the Logout Route

Create a route for user logout:

            @app.route('/logout')
            @login_required
            def logout():
                logout_user()
                flash('You have been logged out.')
                return redirect(url_for('login'))
        

Conclusion

This guide demonstrates how to integrate Flask-Login into a Flask application for user authentication, including user sessions for login and logout. Customize the registration and login templates as needed for your project.





Advertisement