如何将装饰器应用于烧瓶中的所有蓝图URL

che*_*xee 8 python flask flask-login

我有一个蓝图和一些网址功能,

admin_bp = Blueprint('admin', __name__)

@admin_bp.route('/dashboard', methods=['GET', ])
@flask_login.login_required
def dashboard():

    context = {}

    page = 'admin/dashboard.html'
    return render_template(page, **context)

@admin_bp.route('/deny', methods=['GET', ])
@flask_login.login_required
def deny():
    return 'hey bro you dont belong here'
Run Code Online (Sandbox Code Playgroud)

我不想@flask_login.login_required在这个蓝图下为所有url函数复制粘贴装饰器.有没有更好的方法可以为所有蓝图网址应用装饰器?

Rob*_*ert 10

您可以添加before_request()一个函数,该函数将在视图中的每个请求之前运行。

然后,您将需要添加装饰器以向该before_request函数注入附加功能。您需要导入login_required装饰器以确保每个端点都需要登录用户。这个装饰器是flask_login库的一部分。

由于您的视图看起来像是管理员的一部分,因此我还建议您为您的before_request函数添加一个自定义装饰器,例如@role_required('admin'). 该装饰器的功能将位于其他地方并被导入。

@admin_bp.before_request
@login_required
def before_request():
    """ Protect all of the admin endpoints. """
    pass 
Run Code Online (Sandbox Code Playgroud)


lor*_*. j 0

首先检查用户怎么样:

from flask.ext.login import current_user


@admin_bp.before_request
def check_user():
    if not current_user.is_authenticated():
        abort(401)

# your other functions without `@flask_login.login_required`
Run Code Online (Sandbox Code Playgroud)

  • 这并不能回答一般问题,其中可能包括旨在“在”请求之后执行的代码,而不仅仅是在请求之前执行。**@after_request** 函数装饰将响应对象作为输入的函数,但有人可能希望在路由的返回值响应之前对其进行预处理。 (5认同)