gpt4 book ai didi

python-3.x - 为什么我的current_user不通过flask-login进行身份验证?

转载 作者:行者123 更新时间:2023-12-03 15:45:19 25 4
gpt4 key购买 nike

我的目标是使主 View (/)成为登录页面。用户登录后,将根据其角色呈现另一个页面。登录(/auth)时,我看到正确输入了用户名和密码。然后,它尝试呈现/,告诉我我的用户未通过身份验证,并呈现/login。以下是描述此情况的 View :

观看次数

@app.route("/login")
def login():
return flask.render_template('login.html')

@app.route("/", methods=["GET"])
def home():
if current_user.is_authenticated:
if current_user.is_admin():
return flask.render_template('admin_index.html')
return flask.render_template('user_index.html')
logger.info("Not authenticated. Going back to login.")
return flask.render_template('login.html')


@app.route("/auth", methods=["POST"])
def auth():
username = request.form['username']
password = request.form['password']
user = db.session.query(User).filter(User.username == username).first()
logger.info(user)
logger.info("{0}: {1}".format(username, password))
print("user exists? {0}".format(str(user != None)))
print("password is correct? " + str(user.check_password(password)))
if user and user.check_password(password):
user.is_authenticated = True
login_user(user)
return flask.redirect(url_for('home'))
return flask.redirect(url_for('login'))

问题是在我尝试登录后,flask-login的 current_user.is_authenticated始终返回 False。我创建的用户已正确创建并提交到数据库。下面是我的用户模型,根据 flask 登录提供了必要的方法:

用户模型
class User(db.Model):
"""
A user. More later.
"""

__tablename__ = 'User'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(128), unique=True)
hashed_password = db.Column(db.String(160))
admin = db.Column(db.Boolean)

def __init__(self, username, password="changeme123", admin=False):
self.username = username
self.set_password(password)
self.admin = admin
self.is_authenticated = False

def is_active(self):
return True

def is_authenticated(self):
return self.is_authenticated

def is_anonymous(self):
return False

def is_admin(self):
return self.admin

def get_id(self):
return self.id

def __repr__(self):
return '<User {0}>'.format(self.username)

def set_password(self, password):
self.hashed_password = generate_password_hash(password)

def check_password(self, password):
return check_password_hash(self.hashed_password, password)

这是 load_user函数:

load_user
@login_manager.user_loader
def load_user(user_id):
try:
return User.query.get(User.id==user_id)
except:
return None

为什么 current_user.is_authenticated返回 False?我以为 login_user(user)将成为 current_user == user,即被 /auth进行身份验证的人,但事实并非如此。

最佳答案

您有一个名为User.is_authenticated的方法。不过,在User.__init__内,您设置了一个具有相同名称的属性。

self.is_authenticated = False

这将覆盖该方法。然后,每当您检查 current_user.is_authenticated时,您都将访问始终为false的属性。

您应该从 __init__中删除分配,并将 is_authenticated更改为以下内容:
def is_authenticated(self):
return True

如果出于某种原因需要动态设置,请重命名属性,以免影响方法。
def is_authenticated(self):
return self._authenticated

另一个问题是您的 load_user函数。

代替 filter进行 User.id==user_id编码,而是对其进行 get设置。未返回用户,因为 load_user返回的是 User.query.get(True)而不是 User.query.get(user_id)

如果进行以下更改,它将起作用:
@login_manager.user_loader
def load_user(user_id):
try:
return User.query.get(user_id)
except:
return None

关于python-3.x - 为什么我的current_user不通过flask-login进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37597038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com