gpt4 book ai didi

python - 自定义装饰器的 Flask 路由错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:39:39 24 4
gpt4 key购买 nike

蓝图.py

### Standard Library Imports ###

################################

### 3rd Party Imports ###
from flask import Blueprint
################################

### Local Imports ###

################################


main = Blueprint('main', __name__)
from .views import *

views.py:

@main.route("/", methods=["GET", "POST"])
@login_required
@check_confirmation
def index():
users=None
form = UserSearchForm()
now = datetime.datetime.now()
current_month = now.month
current_year = now.year
days_in_month = calendar.monthrange(current_year, current_month)[1]
calendar_info = {
"days_in_month": days_in_month,
"current_year": current_year,
"current_month": get_month(),
}
if form.validate_on_submit():
searched = form.username.data
return redirect(url_for("main.search", searched_user=searched))
return render_template('/main/main_index.html',
**calendar_info,
months=months,
users=users,
form=form)

检查确认装饰器:

def check_confirmation(func):
def wrap(*args, **kwargs):
if not current_user.confirmed:
flash("Please confirm your account")
return redirect(url_for("main.unconfirmed"))
else:
return func(*args, **kwargs)
return wrap

有趣的是。使用基于类的 View ,装饰器工作正常但不适用于基于函数的 View 。事实上,我使用基于函数的 View 和蓝图使用 Flask 创建的所有自定义装饰器都会返回一个路由构建错误

关于为什么会发生这种情况有什么想法吗?

最佳答案

事实证明

def check_confirmation(func):
@wraps(func)
def wrap(*args, **kwargs):
if not current_user.confirmed:
flash("Please confirm your account")
return redirect(url_for("main.unconfirmed"))
else:
return func(*args, **kwargs)
return wrap

您需要从 functools 库中导入 wraps 函数我认为您不需要这样做,因为我认为 wraps 装饰器只是获取有关函数的信息。但我猜它这样做是为了区分常规定义的 functionview function。我的猜测对吗?

但据此判断,我认为 flask 会自省(introspection)函数,我很确定它确实如此。

但令我困扰的是,当您使用基于类 的 View 时,check_confirmation 不需要@wraps

关于python - 自定义装饰器的 Flask 路由错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34380272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com