[我目前正在为一门课程做项目,并且不允许在我的Flask应用程序中使用ORM,所以我使用通过db.session.execute()命令查询sql的方法创建了自己的类。
我的问题是,当“ @ login_manager.user_loader”试图获取user_id时,它失败了,因为id为“ None”。我不理解以下内容:
注意:如果我将搜索内容从ID更改为用户名,则代码可以正常工作并且网站可以正常运行,但是 current_user.is_authenticated:
不起作用,我可以继续登录即使使用不同的用户帐户,也可以达到我希望的次数。
这是项目回购的链接,以防有人要看Github repo link
我的应用当前与以下文件树打包在一起:
这是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的方法。我的问题是...
所以我想出了如何通过创建@classmethod解决我的问题。我是python的新手,所以在我的研究中尚未达到@classmethod。但是通过创建@classmethod,我能够正确返回user_loader
通常返回的对象类型,而不是我在原始代码中返回的元组类型。这是我在User类末尾创建的@classmethod: