본문 바로가기

About/Flask

[Flask] 에러 처리 (사용자 정의 에러 핸들러, JSON 에러 핸들러)

사용자 정의 처리 핸들러

HTML 웹 어플리케이션에서는 404, 50x 에러가 발생하면 보통 특정 HTML 페이지를 보여준다. 플라스크는 자동으로 이렇게 동작하지만, 마이크로서비스에서는 클라이언트에 보내는 응답을 좀 더 조정할 필요가 있다. 이 때 유용한 기능이 사용자 정의 에러 핸들러(custum error handler)이다.

 

JSON을 사용하여 마이크로서비스를 구현할 때는 클라이언트에 보내는 모든 동작을 JSON 포맷으로 맞추는 것이 관례이다. 마이크로서비스를 사용하는 클라이언트는 모든 응답을 파싱할 필요가 있기 때문이다.

 

플라스크는 app의 에러 처리를 조정할 수 있는 여러 함수를 제공한다. 

첫 번째는 @app.route 처럼 동작하는 @app.errorhandler 데코레이터다. 이 데코레이터는 특정 에러 코드에 함수를 연결한다.

 

예제 코드

from flask import Flask, jsonify

app = Flask(__name__)

@app.errorhandler(500)
def error_handling_500(error):
    return jsonify({'Error': "Some Error.."}, 500)

@app.route('/api')
def my_service():
    raise TypeError("Some Exception...")

app.run()

 

실행 결과

requests 모듈을 이용하여 /api에 요청한 결과

 

다른 4xx, 50x 에러 시에도 JSON 응답을 보내려면 모든 에러코드에 대해 함수를 등록해줘야 한다.

 

abort.mapping 딕셔너리를 통해 에러 목록을 얻을 수 있는데 이를 이용하여 app.register_error_handler를 사용해 모든 에러에 대해 error_handling 함수를 등록할  수 있다.

 

from flask import Flask, jsonify, abort
from werkzeug.exceptions import HTTPException, default_exceptions, _aborter


def JsonApp(app):
    def error_handling(error):
        if isinstance(error, HTTPException):  # HTTP Exeption의 경우
            result = {
                'code': error.code,
                'description': error.description,
                'message': str(error)
            }
        else:
            description = _aborter.mapping[500].description # 나머지 Exception의 경우
            result = {
                'code': 500,
                'description': description,
                'message': str(error)
            }
        resp = jsonify(result)
        resp.status_code = result['code']
        return resp
        
    for code in default_exceptions.keys(): # 에러 핸들러 등록 
        app.regsiter_error_handler(code, error_handling)

    return app


app = JsonApp(Flask(__name__))


@app.route('/api')
def my_service():
    raise TypeError("Some Exception...")


if __name__ == "__main__":
    app.run()

위의 JsonApp  함수는 플라스크 app 인스턴스를 감싼 뒤에 발생 가능한 모든 4xx, 50x 에러에 대해 사용자 정의 JSON 에러 핸들러를 설정한다.


다음 도서를 참고하였습니다.

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=191830482 

 

파이썬 마이크로서비스

파이썬에 대한 기본 지식, 커맨드라인, HTTP 기반 애플리케이션에 대한 기본 지식을 갖추고 있으며, 파이썬 3를 활용한 마이크로서비스 개발, 테스트, 확장, 관리 방법을 배우고 싶은 독자를 대상

www.aladin.co.kr