Flask-Login helps you manage user login and keep users logged in easily. It handles remembering who is logged in and protecting pages that need login.
Flask-Login extension
from flask_login import LoginManager, login_user, logout_user, login_required, current_user login_manager = LoginManager() login_manager.init_app(app) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) # To log in a user: login_user(user) # To protect a route: @login_required def protected_route(): pass # To log out a user: logout_user()
Initialize LoginManager with your Flask app using init_app().
Define a user_loader function to load users by ID from your database.
from flask_login import LoginManager login_manager = LoginManager() login_manager.init_app(app)
@login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
from flask_login import login_user # After verifying user credentials: login_user(user)
from flask_login import login_required @app.route('/dashboard') @login_required def dashboard(): return 'Welcome to your dashboard!'
This small Flask app uses Flask-Login to let a user log in by entering a username. It protects the '/protected' page so only logged-in users can see it. Users can also log out.
from flask import Flask, redirect, url_for, request from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user app = Flask(__name__) app.secret_key = 'secret-key' login_manager = LoginManager() login_manager.init_app(app) # Simple user class class User(UserMixin): def __init__(self, id): self.id = id # Fake user database users = {'user1': User('user1')} @login_manager.user_loader def load_user(user_id): return users.get(user_id) @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form.get('username') if username in users: login_user(users[username]) return redirect(url_for('protected')) return 'Invalid username', 401 return '''<form method="post"> <input name="username" placeholder="Username"> <input type="submit" value="Login"> </form>''' @app.route('/protected') @login_required def protected(): return f'Logged in as: {current_user.id}' @app.route('/logout') @login_required def logout(): logout_user() return 'Logged out' if __name__ == '__main__': app.run(debug=False)
Always set a secret key in your Flask app to keep sessions secure.
Flask-Login requires your user class to have an id attribute and inherit from UserMixin.
Use @login_required to protect routes that need login.
Flask-Login makes user login management simple and secure.
It helps keep track of logged-in users and protect pages.
Set up requires initializing LoginManager and defining a user loader.
Practice
Flask-Login extension in a Flask application?Solution
Step 1: Understand Flask-Login's role
Flask-Login is designed to manage user sessions, making it easy to log users in and out securely.Step 2: Compare options with Flask-Login's purpose
Creating database models, styling pages, or sending emails are not handled by Flask-Login.Final Answer:
To manage user sessions and handle login/logout functionality -> Option BQuick Check:
Flask-Login manages user sessions = A [OK]
- Confusing Flask-Login with database or styling tools
- Thinking Flask-Login sends emails
- Assuming it creates user database models
LoginManager in a Flask app using an application factory pattern?Solution
Step 1: Recall Flask-Login initialization pattern
The usual pattern is to create a LoginManager instance without arguments, then callinit_app(app)to bind it.Step 2: Check each option's syntax
login_manager = LoginManager(); login_manager.init_app(app) correctly creates the instance and callsinit_app(app). login_manager = LoginManager(app) tries to pass app to constructor which is not standard. login_manager = LoginManager(app=app) uses a wrong keyword argument. login_manager = LoginManager.init_app(app) callsinit_appas a class method, which is invalid.Final Answer:
login_manager = LoginManager(); login_manager.init_app(app) -> Option AQuick Check:
Use init_app() after creating LoginManager = C [OK]
- Passing app directly to LoginManager constructor
- Using wrong argument names
- Calling init_app as a class method
load_user('42') return if the user with ID 42 exists in the database?
from flask_login import LoginManager
login_manager = LoginManager()
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))Solution
Step 1: Understand user_loader function role
The user_loader function receives a user ID as a string and returns the corresponding User object or None if not found.Step 2: Analyze the code behavior
The function converts the string ID to int, then queries the database for that user. If user 42 exists, it returns the User object.Final Answer:
A User object with ID 42 -> Option DQuick Check:
user_loader returns User object = D [OK]
- Thinking user_loader returns True/False
- Assuming user_id must be int already
- Expecting a string return instead of User object
login_manager = LoginManager()
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
login_manager.init_app(app)Solution
Step 1: Check user_loader function correctness
The typical way to get a user by ID in Flask-SQLAlchemy isUser.query.get(user_id). UsingUser.get(user_id)will cause an AttributeError.Step 2: Verify other parts of the code
Callinginit_app(app)after defining user_loader is fine. The decorator syntax is correct. Creating LoginManager before app is allowed if init_app is called later.Final Answer:
User.get(user_id) should be User.query.get(user_id) -> Option AQuick Check:
User.get() is invalid, use User.query.get() = B [OK]
- Using User.get() instead of User.query.get()
- Thinking init_app must be called before user_loader
- Misunderstanding decorator syntax
Solution
Step 1: Recall Flask-Login's route protection method
Flask-Login provides a@login_requireddecorator to easily protect routes so only logged-in users can access them.Step 2: Evaluate other options
Checkif current_user.is_authenticatedinside the route and redirect if not is possible but less clean and requires manual redirect logic. Manually check session variables for user login status is low-level and error-prone. Addlogin_manager.login_view = 'login'inside the route function sets the login page globally but does not protect routes by itself.Final Answer:
Use the @login_required decorator on the route function -> Option CQuick Check:
Use @login_required to protect routes = A [OK]
- Manually checking login status instead of using decorator
- Confusing login_view setting with route protection
- Ignoring Flask-Login's built-in decorators
Ready to prove it?
Pass the test and this pattern moves unknown
