如何在Flask中创建装饰器?

2024-10-03 13:25:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以做些什么来替换if和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'))

Tags: formgetreturnifdef地方current条件
2条回答

您必须使用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了解更多信息

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

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

这为登录用户定义了一个单独的装饰程序。
使用decorator非常简单,只需包含一行:

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

瞧!你不必再使用那些讨厌的条件了

有关更多信息,请访问here

相关问题 更多 >