我正在使用 Flask 并有两个装饰器,我试图在某些路由上使用它们以更加 Pythonic,防止代码重用并提高可读性。
第一个只是检查用户是否已登录,否则将用户重定向到登录页面。这工作正常。
在此之后,我检查用户“类”(管理员、经理、标准用户等),但是这个不起作用,我不确定缺少什么。
从routes.py:
@app.route('/user/user-account.html', methods=['GET', 'POST'])
@login_required
def cna_account():
if valid_user() == True:
result = get_user_account()
return render_template('user/user-account.html', result=result)
else:
return redirect(url_for('index'))
@login_reqiured
工作正常,这是代码:
@wraps(f)
def wrap(*args, **kwargs):
if 'logged_in' in session:
return f(*args, **kwargs)
else:
return redirect(url_for('index'))
return wrap
我为其他不起作用的装饰器尝试了什么:
def valid_user(f)
: ''' 确保只有基本用户可以查看基本用户页面 '''
@wraps(f)
def wrap(*args, **kwargs):
if 'access' in session and session['access'] == 'c':
return f(*args, **kwargs)
else:
return redirect(url_for('index'))
这些存储在一个单独的模块中,该模块导入到 routes.py 中,我唯一能猜到的可能是会话没有被传递,即使它包含在模块和路由中的烧瓶中,但我也不确定这将如何补救。
我试图用它做的是:拥有使用两个装饰器并且不需要if valid_user() == True
检查的路线。相反,它应该起作用并且看起来像:
@app.route('/user/user-account.html', methods=['GET', 'POST'])
@login_required
@valid_user
def cna_account():
result = get_user_account()
return render_template('user/user-account.html', result=result)
对我在这里缺少的东西有什么帮助吗?我需要将会话变量作为参数传递给@valid_user
吗?我尝试了几种不同的方法,但仍然抛出错误。
非常感激!
你需要返回的内部函数wrap
中valid_user
:
def valid_user(f):
@wraps(f)
def wrap(*args, **kwargs):
if 'access' in session and session['access'] == 'c':
return f(*args, **kwargs)
return redirect(url_for('index'))
return wrap
虽然不从外部装饰器函数返回任何内容是完全有效的,但请记住,被包装的函数在运行时传递给包装器,因此,返回值将是None
:
def foo(f):
print("inside decorator with '{}'".format(f.__name__))
def inner():
return 10
@foo
def bar():
return 'in bar'
"inside decorator with 'bar'"
>>>bar()
回溯(最近一次调用):文件“”,第 1 行,在 TypeError 中:“NoneType”对象不可调用
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句