如何在烧瓶中创建装饰器?

时间:2020-08-14 14:09:25

标签: python flask

如果替换else,我该怎么办。我将在几个地方需要这种情况。

@blueblue.route('/', methods=['GET', 'Post'])
# 
def deactivate_trainer():
    if current_user.is_authenticated and current_user.account_type == 'su':

        form = ActivateDeactivateTrainer
        return render_template('x.html', form=form)
    
    else:
        return redirect(url_for('blueblue.login'))

2 个答案:

答案 0 :(得分:2)

要在登录时验证用户身份,可以执行以下操作:

from flask import redirect, render_template, request, session
from functools import wraps

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not (current_user.is_authenticated and current_user.account_type == 'su'):
            return redirect(url_for('blueblue.login'))
        return f(*args, **kwargs)
    return decorated_function

这为登录用户定义了一个单独的装饰器。
使用装饰器就像添加一条简单的行一样简单:

@blueblue.route('/', methods=['GET', 'Post'])
@login_required
def deactivate_trainer():
    form = ActivateDeactivateTrainer
    return render_template('x.html', form=form)

瞧!您不必再使用那些烦人的if-else条件!

访问here了解更多信息。

答案 1 :(得分:1)

您必须使用functools.wraps()在烧瓶中处理此问题
这是我编辑您的代码的方式:

from functools import wraps
from flask import redirect, url_for
def my_decorator(function):
    @wraps(function)
    def decorated_function(*args, **kwargs):
        if current_user.is_authenticated and current_user.account_type == 'su':
            return function(*args, **kwargs)
        else:
            return redirect(url_for('blueblue.login'))

您可以通过这种方式使用装饰器

@blueblue.route('/', methods=['GET', 'Post'])
@my_decorator
def deactivate_trainer():
    #...

您还可以看到Flask documentation以获得更多信息