我正在尝试使用基本的 login_required 方法来保护我的页面。这适用于主页(仪表板),但不适用于加载的蓝图。还有什么办法可以保护他们吗?我想保持我的应用程序模块化,而不是将所有代码放在主应用程序中。
我有以下内容:
app = flask.Flask(__name__)
app.secret_key = 'T0pS3cr3tKeY!'
def login_required(f):
@wraps(f)
def wrap(*args, **kwargs):
if 'logged_in' in flask.session:
return f(*args, **kwargs)
else:
flask.flash('You need to login first!')
return flask.redirect(flask.url_for('/'))
return wrap
@app.route('/', methods=['GET', 'POST'])
def login():
error = None
if flask.request.method == 'POST':
if flask.request.form['email'] != 'admin' or flask.request.form['password'] != 'admin':
error = 'Invalid login details, please try again.'
else:
flask.session['logged_in'] = True
flask.flash('You were just logged in!')
return flask.redirect(flask.url_for('dashboard'))
return flask.render_template('login.html', error = error)
@app.route('/dashboard')
@login_required
def dashboard():
return flask.render_template('index.html')
@app.route('/logout')
def logout():
flask.session.pop('logged_in', None)
flask.flash('You were just logged out!')
return flask.redirect(flask.url_for('login'))
app.register_blueprint(app1)
app.register_blueprint(app2)
app.register_blueprint(app3)
Run Code Online (Sandbox Code Playgroud)
如果你想应用@login_required到所有路径,你可以使用装饰@app.before_request器。我认为这可以与其他蓝图一起使用。
然后,如果您想添加异常/,您可以在装饰函数内使用 if 语句来执行此操作。
或者,您可以将该装饰器移动到它自己的蓝图中,然后在另一个蓝图中注册一个蓝图。(做了一些测试,看起来嵌套的顺序很重要。)