Flask 身份验证和蓝图

sng*_*ngx 5 python flask

我正在尝试使用基本的 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)

fal*_*ets 1

如果你想应用@login_required到所有路径,你可以使用装饰@app.before_request。我认为这可以与其他蓝图一起使用。

然后,如果您想添加异常/,您可以在装饰函数内使用 if 语句来执行此操作。

或者,您可以将该装饰器移动到它自己的蓝图中,然后在另一个蓝图中注册一个蓝图。(做了一些测试,看起来嵌套的顺序很重要。)