flask-jwt-extended: настройка сообщения об ошибке
Когда истечет токен flask-jwt-extended, HTTP-запрос приведет к ответу JSON
{
"msg": "Token has expired"
}
Мое приложение имеет фиксированный формат ответа об ошибке:
{
"message": "Project name 'Test 8' already exist.",
"error": {
"resource": "Project",
"field": "project_name",
"code": "already_exists",
"stack_trace": "(psycopg2.IntegrityError) duplicate key value violates unique constraint \"project_name_idx\"\nDETAIL: Key (project_name)=(Test 8) already exists.\n [SQL: 'INSERT INTO project (project_name, project_root, deadline_id) VALUES (%(project_name)s, %(project_root)s, %(deadline_id)s) RETURNING project.project_id'] [parameters: {'project_name': 'Test 8', 'project_root': 'P:\\\\Test8', 'deadline_id': 2}]"
}
}
Как настроить ответ об ошибке flask-jwt-extended?
2 ответа
Примеры этого описаны здесь: http://flask-jwt-extended.readthedocs.io/en/latest/changing_default_behavior.html
Документы по API находятся здесь: http://flask-jwt-extended.readthedocs.io/en/latest/api.html
Если вы хотите предоставить возможность изменять стандартный ответ об ошибке JSON, возвращаемый Flask JWT, чтобы вы могли отправлять обратно свой собственный стандартный формат сообщения об ошибке, вам придется использовать функции загрузчика JWTManager. В частности, expired_token_loader
# Using the expired_token_loader decorator, we will now call
# this function whenever an expired but otherwise valid access
# token attempts to access an endpoint
@jwt.expired_token_loader
def my_expired_token_callback():
return jsonify({
'status': 401,
'sub_status': 42,
'msg': 'The token has expired'
}), 401
Выполнение этого может оказаться утомительным, если использовать все функции загрузчика для всех различных способов проверки токена.
Вы могли бы написать свою собственную универсальную служебную функцию, которая возвращает часть значения любого текстового атрибута объекта ответа, а затем поместить его в ваш фиксированный формат сообщения об ошибке, который необходимо вернуть.
Пример:
def extract_response_text(the_response):
return the_response.json().get('msg')
Также я забыл упомянуть, что вы можете взять приведенный выше пример и использовать декоратор @app.after_request. Это позволит вам настроить все конечные точки ваших приложений на использование этого метода перед возвратом ответа. В котором вы можете изменить или создать свою конкретную полезную нагрузку ответа JSON.