【问题标题】:Simplish Flask methodview decorator简化 Flask 方法视图装饰器
【发布时间】:2012-05-24 15:53:01
【问题描述】:

我正在开发一个验证 api 令牌的装饰器,我的第一个任务是以最小的工作顺序获取装饰器:

def check_token(view_method):
    @wraps(view_method)
    def wrapped_view(*args, **kwargs):
        token = request.args['token']
        if token is None:
            abort(403)
        return view_method(*args, **kwargs)
    return wrapped_view

这种工作方式,即如果提供了令牌,则视图工作,但如果没有提供 400 Bad Request 错误。我想发送一个 403 错误,但我还没有意识到这一点。

这有什么问题,它只返回 400 错误?我该如何改进?

【问题讨论】:

  • 可能是因为token = request.args['token']本身在到达abort(403)之前就抛出了KeyError
  • 我的意思是request.args 中没有密钥token。试试request.args.get('token', None) 看看是否可行。
  • 我想这是我目前不知道的,让我们试试吧。
  • 这行得通,所以如果您在下面回答,我会勾选它。 request 是一个 Werkzeug MultiDict,因此我需要完善我对它和 python 的理解,谢谢。

标签: python decorator flask


【解决方案1】:

request.args 是一个 MultiDict,如果请求的密钥不在 dict 中,它会引发。这里request.args['token'] 在达到abort(403) 之前上升。几个解决方案是:

## If a 2nd optional argument is provided to dict.get then
## it does not raise if key is not found. Instead returns
## the 2nd argument passed as default.

token = request.args.get('token', None)
    if not token:
        ## Error handling

或者:

if 'token' not in request.args or not request.args['token']
    ## Error handling

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2014-06-01
    • 2020-01-11
    • 2020-03-07
    • 1970-01-01
    • 2018-12-30
    • 2020-07-15
    相关资源
    最近更新 更多