Flask自定义装饰器not_login_required失效问题求助
问题原因及解决方法
你的装饰器不起作用的核心原因是装饰器顺序错误,同时装饰器缺少functools.wraps来保留函数元信息(可避免潜在问题)。
1. 修正装饰器顺序
Flask的@app.route装饰器需要最靠近被装饰的视图函数,它的作用是将当前装饰的函数注册为路由的处理逻辑。你当前的写法是先给login函数套上自定义装饰器,再套路由装饰器,这会导致路由注册的是未经过not_login_required处理的原函数,装饰器逻辑自然不会生效。
正确的使用顺序:
@app.route('/login/', methods=['GET', 'POST']) @not_login_required def login(): # 你的业务代码
2. 完善装饰器(添加functools.wraps)
顺序修正后装饰器即可生效,但建议给装饰器添加functools.wraps,它会将原函数的元信息(如函数名、文档字符串等)复制到包装函数中,避免Flask在处理路由或调试时出现异常。
完善后的装饰器代码:
from functools import wraps from flask import current_user, redirect def not_login_required(func): @wraps(func) def wrapper(*args, **kwargs): if current_user.is_authenticated: return redirect('/') return func(*args, **kwargs) return wrapper
调整后,not_login_required装饰器就能正常工作:已认证用户访问/login/时会被重定向到首页,未认证用户可正常进入登录页面。
内容的提问来源于stack exchange,提问作者Minuta18
相关产品推荐
相关产品推荐

