Python Eve Auth 无法 return 401 异常

Python Eve Auth can't return 401 exceptions

我是 运行 Python Eve 的 demo code,我在 Auth 部分遇到了问题。我是 运行 的代码与 repo 相同,除了 settings.py 中的 MongoDB URI。

# We want to seamlessy run our API both locally and on Heroku. If running on
# Heroku, sensible DB connection settings are stored in environment variables.
MONGO_URI = 'mongodb://****:****@localhost:27017/admin'
MONGO_DBNAME = 'apitest'

如果我在 Basic Auth 中输入正确的凭据(user=admin passwd=secret),一切正常,但如果我不输入授权 header 或不正确的凭据,我就不会得到 401,如我所料,但应用程序崩溃返回 500。这就是回溯。

[2019-03-28 12:55:32,082] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/eve/methods/common.py", line 317, in rate_limited
    return f(*args, **kwargs)
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/eve/auth.py", line 79, in decorated
    return auth.authenticate()
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/eve/auth.py", line 152, in authenticate
    abort(401, description="Please provide proper credentials", response=resp)
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/werkzeug/exceptions.py", line 752, in abort
    return _aborter(status, *args, **kwargs)
  File "/home/biscas/code/Tools/eve-demo/venv/lib/python3.6/site-packages/werkzeug/exceptions.py", line 733, in __call__
    raise self.mapping[code](*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'response'

我只用烧瓶就能重现这个问题。看起来它与最新的 werkzeug 版本有关。 Flask 没有指定要使用哪个 werkzeug,只是说任何高于 0.14 的东西,所以你会自动获得最新版本(今天是 0.15.1)等等。版本 0.15.0 稍微改变了 http 异常的实现,特别是 this bit right here 引入了 Unauthorized http 异常构造函数,因此它现在不接受 response 参数。在它简单地扩展 HTTPException.

之前

所以我建议在您的项目要求中简单地固定一个特定版本的 werkzeug。任何低于 0.15 版本的版本,比如说 0.14.1 应该适合你。

您还可以做什么:

  • 向 eve 开发者报告问题
  • 也许与 werkzeug 团队一起提高它也会有所帮助