Python 用户\u loader()函数没有为我提供任何信息时出现Flask\u登录问题

Python 用户\u loader()函数没有为我提供任何信息时出现Flask\u登录问题,python,authentication,flask,flask-login,Python,Authentication,Flask,Flask Login,我目前正在为一门课程制作项目,我不允许在我的Flask应用程序中使用ORM,因此我创建了自己的类,其中包含使用db.session.execute()命令查询sql的方法 我的问题是,当“@login\u manager.user\u loader”尝试获取用户id时,它失败了,因为id为“无”。 我不明白以下几点: “用户\u加载程序”在何时何地尝试使用用户\u id进行检查 用户id指的是什么或其值 为什么user_id没有从我在login app.route创建的用户类中获取值id 注意:

我目前正在为一门课程制作项目,我不允许在我的Flask应用程序中使用ORM,因此我创建了自己的类,其中包含使用db.session.execute()命令查询sql的方法

我的问题是,当“@login\u manager.user\u loader”尝试获取用户id时,它失败了,因为id为“无”。 我不明白以下几点:

  • “用户\u加载程序”在何时何地尝试使用用户\u id进行检查
  • 用户id指的是什么或其值
  • 为什么user_id没有从我在login app.route创建的用户类中获取值id
  • 注意:如果我将搜索内容从id改为用户名,代码会正常工作,网站也会正常工作,
    但是
    当前用户。是否经过身份验证:
    不起作用,即使使用不同的用户帐户,我也可以随时登录

    我的应用程序当前已打包为以下文件树:

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

    @login\u manager.user\u loader
    def加载用户(用户id):
    返回User.searchwo(id=User\u id)
    类用户(UserMixin):
    def u u init u u;(self,username,password=None,id=None):
    self.username=用户名
    self.password=密码
    self.id=id
    def创建(自我):
    db.session.execute(“插入用户(用户名,密码)值(:用户名,密码)”,{“用户名”:self.username,“密码”:self.password})
    db.session.commit()
    def搜索(自我):
    response=db.session.execute(“从username=:username“,{“username”:self.username}的用户中选择id、用户名、密码)。fetchone()
    如果响应!=无:
    self.id=响应[0]
    self.password=响应[2]
    返回响应
    @静力学方法
    def searchwo(id=None,username=None):
    如果id!=无:
    response=db.session.execute(“从id=:id“,{“id”:id})的用户中选择id、用户名、密码)。fetchone()
    elif用户名!=无:
    response=db.session.execute(“从username=:username“,{“username”:username}的用户中选择id、用户名、密码)。fetchone()
    返回响应
    
    这是routes.py中的登录代码片段:

    其中,我在“user=user(…”处创建了一个用户对象类

    @app.route(“/”,方法=['GET','POST'])
    def login():
    如果当前用户已通过身份验证:
    返回重定向(url_for('main'))
    form=LoginForm()
    if form.validate_on_submit():
    usertemp=User.searchwo(username=form.username.data)
    如果usertemp==无:
    用户=无
    其他:
    user=user(usertemp[1],password=usertemp[2])
    如果用户和bcrypt.检查\u密码\u散列(user.password、form.password.data):
    login\u user(user,memory=form.memory.data)
    返回重定向(url_for('main'))
    其他:
    flash('无效凭据!如果您不是用户,请先注册')
    返回呈现模板('index.html',title='Book Reviews',form=form)
    
    所以我找到了通过创建@classmethod来解决问题的方法。 我是python新手,所以在我的研究中还没有接触到@classmethod。
    但是通过创建@classmethod,我能够正确地返回
    user\u loader
    通常返回的对象类型,而不是在原始代码中返回的元组类型。 这是我在用户类末尾创建的@classmethod:

    @classmethod
    def搜索id(cls,id):
    response=db.session.execute(“从id=:id“,{“id”:id})的用户中选择id、用户名、密码)。fetchone()
    返回cls(响应[1],响应[2],响应[0])
    @类方法
    def searchuser(cls,用户名):
    response=db.session.execute(“从username=:username“,{“username”:username}的用户中选择id、用户名、密码)。fetchone()
    返回cls(响应[1],响应[2],响应[0])
    
    这就是用户_加载器现在的样子:

    @login\u manager.user\u loader
    def加载用户(用户id):
    返回User.searchid(id=User\u id)
    
    根据我在创建@classmethod时调试应用程序时的理解(回答我的问题):

  • user\u loader
    在检查时以及我被重定向或页面刷新时执行检查
  • user\u id
    从登录路径上创建的用户类对象获取其值,该对象从登录表单中的用户输入获取
  • user\u id
    无法获取该值,因为在登录app.route检查凭据后,我忘记用该id更新用户类对象。这意味着我可能已经能够在不创建@classmethod的情况下解决该问题(但对此不确定)
  • 如果我对这3点的理解不正确,请纠正我