Flask自定义装饰器无法正常运行

时间:2018-05-01 11:58:22

标签: python flask decorator python-decorators

我正在使用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}}?我尝试了几种不同的方法,但仍然会抛出错误。

非常感谢!

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'对象不可调用