user_loader()函数的Flask_login问题,给我任何内容

问题描述 投票:0回答:1

[我目前正在为一门课程做项目,并且不允许在我的Flask应用程序中使用ORM,所以我使用通过db.session.execute()命令查询sql的方法创建了自己的类。

我的问题是,当“ @ login_manager.user_loader”试图获取user_id时,它失败了,因为id为“ None”。我不理解以下内容:

  1. “何时“ user_loader”尝试与user_id一起检查
  2. user_id指的是什么或其值
  3. 为什么user_id无法从我在登录app.route中创建的用户类中获取值ID。

注意:如果我将搜索内容从ID更改为用户名,则代码可以正常工作并且网站可以正常运行,但是 current_user.is_authenticated:不起作用,我可以继续登录即使使用不同的用户帐户,也可以达到我希望的次数。

这是项目回购的链接,以防有人要看Github repo link

我的应用当前与以下文件树打包在一起:

Package File Tree

这是models.py中User类的代码段:

@login_manager.user_loader
def load_user(user_id):
    return User.searchwo(id=user_id)

class User(UserMixin):

    def __init__(self, username, password=None, id=None):
        self.username = username
        self.password = password
        self.id = id

    def create(self):
        db.session.execute("INSERT INTO users (username, password) VALUES (:username, :password)", {"username": self.username, "password": self.password})
        db.session.commit()

    def search(self):
        response = db.session.execute("SELECT id,username,password FROM users WHERE username = :username", {"username":self.username}).fetchone()
        if response != None:
            self.id = response[0]
            self.password = response[2]
        return response

    @staticmethod
    def searchwo(id=None, username=None):
        if id != None:
            response = db.session.execute("SELECT id,username,password FROM users WHERE id = :id", {"id":id}).fetchone()
        elif username != None:
            response = db.session.execute("SELECT id,username,password FROM users WHERE username = :username", {"username":username}).fetchone()
        return response

这是routes.py中的登录代码片段:

我在“ user = User(.....”“处创建用户对象类的位置>

@app.route("/", methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('main'))
    form = LoginForm()
    if form.validate_on_submit():
        usertemp = User.searchwo(username=form.username.data)
        if usertemp == None:
            user = None
        else:
            user = User(usertemp[1], password=usertemp[2])
        if user and bcrypt.check_password_hash(user.password, form.password.data):
            login_user(user, remember=form.remember.data)
            return redirect(url_for('main'))
        else:
            flash('Invalid credentials! if your not a user please register first.')
    return render_template('index.html', title='Book Reviews', form=form)

我目前正在为一门课程做项目,并且不允许在Flask应用程序中使用ORM,所以我创建了自己的类,并使用db.session.execute()命令查询sql的方法。我的问题是...

python authentication flask flask-login
1个回答
0
投票

所以我想出了如何通过创建@classmethod解决我的问题。我是python的新手,所以在我的研究中尚未达到@classmethod。但是通过创建@classmethod,我能够正确返回user_loader通常返回的对象类型,而不是我在原始代码中返回的元组类型。这是我在User类末尾创建的@classmethod:

© www.soinside.com 2019 - 2024. All rights reserved.