比较来自世界各地的卖家的域名和 IT 服务价格

为什么我的。 current_user B B的不经过身份验证。 flask-login?

我的目标是让我的家庭看 /
/

/ 登录页面。 用户进入系统后,根据其角色显示另一页面。 当我进入系统时 /
/auth

/, 我看到输入用户名和密码正确。 然后他试图想象
/

, 我告诉我我的用户未经身份验证,并可视化
/login

. 以下是描述它的视图:

看法


@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's
current_user.is_authenticated

总是回报
False

在我试图登录之后。 我创建的自定义用户是正确创建并在数据库中修复的。 下面是我的用户模型,必要的方法按照 flask-login:

用户模型


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

, 那是, , 谁被B由B认证。
/auth

, 但似乎不是。
</user>
已邀请:

龙天

赞同来自:

你有一个名为的方法
User.is_authenticated

. 但是,里面
User.__init__

您使用相同名称安装属性。


self.is_authenticated = False


这重新定义了该方法。 然后,每次 , 当你检查一下
current_user.is_authenticated

, 您可以访问始终为假的属性。

您必须删除预约
__init__

并改变
is_authenticated

下一个:


def is_authenticated/self/:
return True


如果由于某种原因需要它是动态的,则重命名该属性,以使其不会遮住方法。


def is_authenticated/self/:
return self._authenticated


另一个问题与您的功能有关。
load_user

.

反而
filter

ing 为了
User.id==user_id

, 你
get

ting 他的。 用户没有返回,因为
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

要回复问题请先登录注册