Python 用户\u loader()函数没有为我提供任何信息时出现Flask\u登录问题
我目前正在为一门课程制作项目,我不允许在我的Flask应用程序中使用ORM,因此我创建了自己的类,其中包含使用db.session.execute()命令查询sql的方法 我的问题是,当“@login\u manager.user\u loader”尝试获取用户id时,它失败了,因为id为“无”。 我不明白以下几点: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 注意:
但是
当前用户。是否经过身份验证:
不起作用,即使使用不同的用户帐户,我也可以随时登录
我的应用程序当前已打包为以下文件树:
这是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的情况下解决该问题(但对此不确定)