Posted by Kosal
Web authentication is a vital aspect of web development, ensuring that only authorized users can access protected resources. Flask, a lightweight web framework for Python, provides Flask-Login, an extension that simplifies user authentication and session management. In this article, we'll explore how to integrate Flask-Login into a Flask application to implement secure user authentication.
Folder Structure:
YourProject/
├── app.py
├── templates/
│ └── login.html
Setting up Flask-Login involves initializing the Flask application and configuring it to use Flask-Login. Additionally, a secret key is required for session management.
from flask import Flask
from flask_login import LoginManager
app = Flask(__name__)
app.secret_key = 'your_secret_key'
login_manager = LoginManager()
login_manager.init_app(app)
A User model class represents users in the application. Flask-Login requires certain methods, such as __init__
and get
, to handle user authentication and session management.
from flask_login import UserMixin
class User(UserMixin):
def __init__(self, id):
self.id = id
@staticmethod
def get(user_id):
# Function to retrieve user from the database based on user_id
return User(user_id)
The user_loader function loads a user object from the user ID stored in the session. It's necessary for Flask-Login to work properly.
from flask_login import login_manager
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
Implement a login view where users can authenticate themselves. Upon successful authentication, the user is logged in using the login_user
function, and the session is initiated.
from flask import request, redirect, url_for, render_template
from flask_login import login_user
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# Authenticate user (e.g., check credentials against the database)
user_id = 1 # Dummy user ID for demonstration
user = User(user_id)
login_user(user)
return redirect(url_for('index'))
return render_template('login.html')
Create an HTML template for the login page where users can enter their credentials.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Login Page</title>
</head>
<body>
<h2>Login Page</h2>
<form action="{{ url_for('login') }}" method="POST">
<label for="username">Username:</label><br />
<input type="text" id="username" name="username" /><br />
<label for="password">Password:</label><br />
<input type="password" id="password" name="password" /><br /><br />
<input type="submit" value="Login" />
</form>
</body>
</html>
Use Flask-Login's login_required
decorator to protect views that require authentication. This decorator ensures that only authenticated users can access the protected views.
from flask_login import login_required, current_user
@app.route('/')
@login_required
def index():
return 'Home Page - Welcome, {}'.format(current_user.id)
By appending the if __name__ == '__main__': app.run(debug=True)
block to each relevant step, you ensure that your Flask application starts running whenever the script is executed directly. This setup facilitates development and testing by automatically starting the server with debugging enabled.
if __name__ == '__main__':
app.run(debug=True)
To run the application, execute the following command in the terminal:
python app.py
Conclusion: Flask-Login simplifies the implementation of user authentication in Flask applications, providing a robust solution for managing user sessions securely. By following this guide and incorporating best practices, developers can build web applications with confidence, knowing that user authentication is handled effectively. With Flask-Login, users can interact with applications securely, ensuring a seamless and secure user experience.