사용자 정의 처리 핸들러
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()
실행 결과
다른 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
'About > Flask' 카테고리의 다른 글
[Flask] Session 객체를 이용한 동기식 호출 (0) | 2021.12.31 |
---|---|
[Flask] Flask-SQLAlchemy 사용해보기 (1) | 2021.12.30 |
[Flask] Jinja2 템플릿을 이용한 이메일 생성 (0) | 2021.12.13 |
[Python] Flask Signal (Blinker) (0) | 2021.09.25 |
[Python] Flask 전역 공간 (Flask.g) (0) | 2021.09.25 |