我正在使用Flask并且有两个装饰器,我试图在某些路径上使用更多的Pythonic,防止代码重用,并提高可读性。
其中第一项只是检查用户是否登录,否则将用户重定向到登录页面。这很好。
在此之后我检查用户'class'(管理员,经理,标准用户等),但是这个没有用,我不确定缺少什么。
来自 routes.py :
@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'))
:
'''确保只有基本用户才能查看基本用户页面'''
if valid_user() == True
这些存储在一个单独的模块中,该模块是在routes.py中导入的,我唯一可以猜到的是,即使它包含在模块中的 flask 中,也可能没有传递会话和路线,但我不知道如何解决这个问题。
我正在尝试做的是:让路由使用两个装饰器并且不需要@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
对我在这里失踪的任何帮助?我是否需要将会话变量作为参数传递给{{1}}?我尝试了几种不同的方法,但仍然会抛出错误。
非常感谢!
答案 0 :(得分:1)
您需要在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行,in TypeError:'NoneType'对象不可调用