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?


person Hanxue    schedule 15.11.2017    source источник


Ответы (2)


Примеры этого задокументированы здесь: http://flask-jwt-extended.readthedocs.io/en/latest/changing_default_behavior.html

Документация по API находится здесь: http://flask-jwt-extended.readthedocs.io/en/latest/api.html#module-flask_jwt_extended

person vimalloc    schedule 15.11.2017

Если вы хотите предоставить возможность изменять стандартный ответ об ошибке 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.

person Andrew Spear    schedule 07.07.2018