Flask-Login: 异常:没有为此 LoginManager 安装 user_loader。使用 'LoginManager.user_loader' 装饰器添加一个。

7

我想使用flask_login来管理用户登录,但是遇到了以下错误:

异常:未为此LoginManager安装user_loader。使用“LoginManager.user_loader”装饰器添加一个。

这是我的models.py文件(PS:我使用Flask peewee构建我的模型)

from peewee import *
from playhouse.fields import ManyToManyField
from .__init__ import login_manager
from flask_login import UserMixin, AnonymousUserMixin

db = SqliteDatabase('adminSystem.db')

class BaseModel(Model):
    class Meta:
        database = db

class User(UserMixin, BaseModel):
    name = CharField()
    email = CharField()
    is_admin = BooleanField()
    username = CharField()
    passwd_hash = CharField()
    teacher = ForeignKeyField('self', related_name='students', null=True)

    #def is_authenticated(self):
    #    return True

    #def is_active(self):
    #    return True

    #def is_anonymous(self):
    #    return False

    #def get_id(self):
    #    try:
    #        return unicode(self.id)
    #   except NameError:
    #        return str(self.id)

class Homework(BaseModel):
    owner = ForeignKeyField(User, related_name='homeworks', null=True)
    pub_datetime = DateTimeField()
    connect = TextField()
    homework_id =CharField()
    file_url = CharField()

class Score(BaseModel):
    homework_id = CharField()
    stu_id = CharField()
    grade = IntegerField()
    file_url = CharField()

class AnonymousUser(AnonymousUserMixin):
    def can(self, permissions):
        return False

    def is_administrator(self):
        return False

@login_manager.user_loader
def load_user(userid):
    try:
        #: Flask Peewee used here to return the user object
        return User.get(User.id==userid)
    except User.DoesNotExist:
        return None

这是我的view.py的一部分:

from flask import render_template, url_for, redirect, request, g
from . import auth
from werkzeug.security import generate_password_hash, check_password_hash
from ..models import db, User, Homework, Score
from flask_login import login_user, logout_user, login_required, current_user

@auth.before_app_request
def before_request():
    g.user = current_user

@auth.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        if request.form['role'] == 'teacher':
            user = User.get(User.username == request.form['username'])
            if check_password_hash(user.passwd_hash, request.form['password']):
                login_user(user)
                return redirect(url_for('main.post'))
            return render_template('login.html')
        elif request.form['role'] == 'student':
            user = User.get(User.username == request.form['username'])
            if check_password_hash(user.passwd_hash, request.form['password']):
                login_user(user)
                return redirect(url_for('main.show'))
            return render_template('login.html')
    return render_template('login.html')

有一张图片,我尝试过了。

在此输入图片描述


当我将@login_manager.user_loader放在login_manager.init_app(app)下面时,它可以正常工作。 - Shawn Lu
5个回答

9
你可以使用这个方法。
@login_manager.user_loader
def load_user(user_id):
    return None

login_manager.init_app(app)之后。

1
它能够工作,但我不明白为什么它能够工作。这很奇怪,因为在另一个项目中,我不需要这个,而且该项目具有相同的结构。所以我猜测这是因为我已经更新了库。 - makkasi

4

1
在我的情况下(遵循Miguel Grinberg的教程,第6部分),所需的只是重新启动服务器。

0

这解决了我的问题

@login_manager.user_loader

定义加载用户函数(load_user):

返回获取用户(get_user)的结果


在回答一个已有其他答案的旧问题之前,请确保您的答案添加了新的内容或以其他方式对它们有帮助。对我来说,与这两个已经存在的答案进行比较时所添加的价值不清楚:https://dev59.com/a5vga4cB1Zd3GeqP1mox#57980401 和 https://dev59.com/a5vga4cB1Zd3GeqP1mox#49849243?另外,请注意正确格式化您的代码,并提供解释,而不仅仅是代码,因为它不能解释如何解决问题。请编辑您的答案并澄清任何重要的差异,使得拥有此答案具有价值。 - Ivo Mori

0

正如@code所说,但是不要返回None,尝试返回用户数据。

在yourapp.py中,在login_manager实例下面添加以下代码。

@login_manager.user_loader
def load_user(id):
    return User.query.filter_by(user_id=id).first()

之后,您可以从model.py中删除@login_manager装饰器及其相关函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接