'Missing userloader or request_loader error
i have an isssue with flask-login the user loader is not working
Exception: Missing user_loader or request_loader. Refer to http://flask-login.readthedocs.io/#how-it-works for more info.
and when i try to import the user model in shell:
AttributeError: 'LoginManager' object has no attribute 'load_user'
This is my code:
-------------------app/__init__.py----------------
from app.config import Config
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
#create app
app = Flask(__name__)
app.config.from_object(Config)
#init pckages
db = SQLAlchemy(app)
login_manager = LoginManager(app)
#import Blueprints
from app.blueprints.user.routes import user
from app.blueprints.dashboard.routes import dashboard
#register Blueprints
app.register_blueprint(user)
app.register_blueprint(dashboard)
------------------------------app.py-------------------------------
from app import app
if __name__ == "__main__":
app.run(debug=True)
------------------------------user model------------------------------------
from app import db, login_manager
from flask_login import UserMixin
@login_manager.load_user
def load_user(user):
return User.get(user)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(20), unique=True, nullable=False)
avatar = db.Column(db.String(50), default="default.jpg")
password = db.Column(db.String(60), nullable=False)
def __repr__(self):
return self.username
Solution 1:[1]
The decorator should be
@login_manager.user_loader not load_user
Solution 2:[2]
You can make a slight modification to your current user model. As it is currently, you have:
@login_manager.load_user
def load_user(user):
return User.get(user)
Consider this:
- Import
LoginManagerfromflask_login
from flask_login import LoginManager
login = LoginManager(app)
- Update your
usermodel as follows:
from flask_login import UserMixin
from app import login # the variable from Flask-login
@login.user_loader
def load_user(id):
return User.query.get(int(id)) # slightly modified such that the user is loaded based on the id in the db
The user loader is registered with Flask-Login with the @login.user_loader decorator. The id that Flask-Login passes to the function as an argument is going to be a string, so databases that use numeric IDs need to convert the string to integer as you see above.
Solution 3:[3]
Instead of : @login_manager.load_user def load_user(user): return User.get(user)
try : @login_manager.user_loader def load_user(user): return User.query.get(int(user))
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | mowienay |
| Solution 2 | Gitau Harrison |
| Solution 3 | K4C |
