使用 Flask-Login 临时覆盖来自特定重定向路由的登录消息

Tha*_*Guy 6 python flask flask-login

我有一个 Flask 应用程序并且正在使用 Flask-Login 来管理用户身份验证。主路由 ('/') 需要登录,但是我不希望它显示为该特定路由定义的错误消息。我希望它表现得像它应该闪烁其他路由的错误消息而不是这个路由。这是我的init .py 中的一个片段

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view =  'login'
login_manager.login_message = 'You Must Login to Access This Page!'
login_manager.login_message_category = 'error'
Run Code Online (Sandbox Code Playgroud)

以下来自我的views.py

@app.route('/')
@login_required
def dashboard():
    return render_template('dashboard.html')

@app.route('/login', methods=["GET", "POST"])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = Employee.query.filter_by(email=form.email.data).first()
        if user and user.is_valid_pass(form.password.data):
            remember = form.remember.data == 'y'
            login_user(user, remember=remember)
            next = request.args.get('next')
            return redirect(next or url_for('dashboard'))
        else:
            flash(u'Incorrect Username or Password!', 'error')
            return redirect(url_for('login'))
    return render_template('login.html', form=form)
Run Code Online (Sandbox Code Playgroud)

如您所见,我的主路由密码受到保护,并且由于 login_manager 设置,它正在闪烁消息“您必须登录才能访问此页面!” 当然,我会在登录模板上显示这些错误。但是,我如何确保除了主('/')路线之外的每条路线都相应地发挥作用?我已经阅读了文档,但我看不到任何可以表明它可以完成的内容。

我可以在该特定路由中用 None 简单地覆盖 login_manager.login_message 吗?如果是这样,登录管理器将如何被适当地调用、覆盖,然后再改回来?

Tha*_*Guy 2

我最终所做的只是将 Flask-Login 在这些情况下使用的 GET 变量“next”的值从视图传递给模板。然后选择在与我不想显示的路线匹配的情况下不显示闪烁。

视图中:

next = request.args.get('next')
render_template('dashboard.html' form=form, next=next)
Run Code Online (Sandbox Code Playgroud)

在模板中:

{% if next != '/' %}
  //Loop Displaying Flash Errors
{% endif %}
Run Code Online (Sandbox Code Playgroud)

可能有一种更简单的方法可以丢弃视图中的闪烁,并且您仍然需要确保执行 get_flashed_messages() 操作,否则当您实际显示闪烁时,它们会在某个时刻堆积起来。