authentication - Flask is_authenticated 用户状态在重定向到另一个端点时发生变化
问题描述
我正在尝试制作仅适用于登录用户的端点(addurl)。发生的问题是,当我在 /login 端点上登录时 current_user.is_authenticated 返回'<bound method User.is_authenticated of <User 2>>'(在 login_user(user) 之后)。但是,在重定向到 /addurl 时,current_user.is_authenticated 会以某种方式被覆盖并更改为 False。我该如何解决这个问题?
代码
模型:
from app import db, login_manager
@login_manager.user_loader
def load_user(user_id):
return User.query.get(user_id)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(50), unique=True)
password = db.Column(db.String(1024))
def is_active(self):
"""True, as all users are active."""
return True
def get_id(self):
"""Return the email to satisfy Flask-Login's requirements."""
return self.email
def is_authenticated(self):
"""Return True if the user is authenticated."""
return self.authenticated
def is_anonymous(self):
"""False, as anonymous users aren't supported."""
return False
形式:
class LoginForm(FlaskForm):
email = StringField('Your Username: ', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired()])
submit = SubmitField('Log In')
意见:
@app.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and bcrypt.check_password_hash(user.password, form.password.data):
login_user(user)
return redirect('/addurl')
else:
return render_template('login.html', form=form)
return render_template('login.html', form=form)
@app.route('/addurl', methods=['GET', 'POST'])
def addurl():
form = CompanyForm()
if current_user.is_authenticated:
if form.validate_on_submit():
foo()
return redirect('/base')
else:
flash('you have to be logged in')
return render_template('AddUrl.html', form=form)
解决方案
您似乎忘记了创建addurl
“login_required”路线。尝试这样的事情:
from flask_login import login_required
# original source code...
@app.route('/addurl', methods=['GET', 'POST'])
@login_required
def addurl():
# original source code...
@login_required
装饰师应该做你需要的所有魔法。
另外,请务必LoginManager
正确初始化 in app.py
:
from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
推荐阅读
- pandas - 具有字符串值的两个数据帧的逻辑“或”
- java - 用于从本地数据库获取代码的两因素身份验证脚本
- php - 如何使用 axios、vuejs 和 php 只获取这个值?
- resharper - 如何在 VS 上以相同的方式执行 alt+enter
- python - 打印不符合正则表达式条件或特定条件的某些数据帧行
- python - 在熊猫数据框中将 YYYYMXX 转换为日期
- wpf - IIS 托管 WCF 服务,对 WPF 客户端使用仅 HTTPS 和 Windows 身份验证
- flutter - Flutter 检查 DateTime 是否确实存在
- android - 适用于 Android 11+ 的可移动 micro-sd 卡上的文件的 ContentProvider
- c# - Html.BeginForm (ASP.NET MVC) 的问题