Python Eve Auth не может вернуть 401 исключение

#python #authentication #flask #eve

#python #аутентификация #flask #eve

Вопрос:

Я запускаю демонстрационный код Python Eve, и у меня возникают проблемы с частью аутентификации. Код, который я запускаю, идентичен репозиторию, за исключением URI MongoDB в settings.py .

 # 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 ), но если я не ввожу заголовок авторизации или правильные учетные данные, я не получаю 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'
  

Ответ №1:

Я смог воспроизвести проблему только с помощью flask. Похоже, это связано с последней версией werkzeug. Flask не указывает, какой werkzeug использовать, и просто указывает все, что выше 0.14, поэтому вы автоматически получаете последнюю версию (0.15.1 на сегодняшний день) и далее. Версия 0.15.0 немного изменяет реализацию http-исключений, в частности, в этом фрагменте прямо здесь представлен Unauthorized конструктор http exception, так что теперь он не принимает этот response аргумент. Раньше оно просто расширялось HTTPException .

Поэтому я предлагаю просто указать конкретную версию werkzeug в требованиях к вашему проекту. У вас должно работать все, что ниже версии 0.15, скажем 0.14.1.

Что еще вы можете сделать:

  • Сообщите о проблеме разработчикам eve
  • Возможно, его повышение с помощью команды werkzeug также может быть полезным