Flask 自定义装饰器未按预期运行

卡尔

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

非常感激!

Ajax1234

你需要返回的内部函数wrapvalid_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章