-
플라스크(Flask) ; 에러와 로깅개발/python 2016. 8. 27. 02:04
에러(Error)
일반적으로 웹 브라우저에서 요청한 URL 에 대해 응답이 없으면 발생하는 404 에러가 발생합니다. 이처럼 http 오류 코드에 대해 플라스크에서는 브라우저의 에러코드 화면이 아니라, 사용자가 별도로 지정한 화면으로 처리할 수 있습니다.
우선 간단한 예제 코드부터 보도록 하겠습니다.
@app.errorhandler(404) def page_not_found(error) return render_template('page_not_found.html'), 404
예제코드에서 일단 눈에 띄는 것은 errorhandler 라고 하는 데코레이터와 리턴값이 2개라는 점입니다.
파이썬에 대한 문법을 설명을 제대로 한 적이 없지만, 파이썬에서는 함수에서 여러개의 리턴값을 지정하는 것이 가능합니다. 2번째 인자는 아마 눈치채셨겠지만, http의 status 코드입니다. 만일 이 값을 지정하지 않을 경우, 기본값은 요청에 대한 성공을 의미하는 200 을 가지게 됩니다.
즉, 404를 적지 않을 경우, 요청이 실패하는 경우가 아닌, 성공한 경우 렌더링 된 'page_not_found.html'을 띄워주게 되는 것입니다.
자 이제 다시 코드를 보고 천천히 읽어보면 apphandler 데코레이터를 통해 404 에러코드에 대해 별도처리를 하도록 한 뒤, page_not_found를 정의합니다. 여기서 리턴값은 사용자가 별도로 구성한 'page_not_found.html' 이라는 템플릿입니다.
어렵지 않게 이해하실 수 있겠죠?
로깅(Logging)
이번엔 로깅에 대해 설명드리겠습니다. 로깅 이름만 들으셔도 아시겠지만, 어떠한 오류나 혹은 특정한 요청 등등이 발생하면 이에 대한 로그를 남기고자 할 때 사용합니다. 애플리케이션 객체를 생성했다면 해당 객체 아래에 logger 라는 인스턴스에 접근할 수 있습니다. 아래쪽에 간단한 예시가 있습니다.
app.logger.debug('A value for debugging') app.logger.warning('A warning ocurred (%d apples)', 42) app.logger.error('An error ocurred')
위의 로거는 파이썬 logging 모듈 내의 Logger 객체의 인스턴스입니다. 그럼 예제 코드를 들어 이 로거 객체를 이용하는 법을 살펴보겠습니다. 아래 코드는 이전까지의 포스팅에서 사용했던 코드에 errorhandler 데코레이터를 추가한 코드입니다. page_not_found.html 파일은 hello.html과 마찬가지로, template 폴더 아래에 적당히 작성해 주세요.
#hello.py from flask import Flask, render_template app = Flask(__name__) @app.errorhandler(404) def page_not_found(error): app.logger.error(error) return render_template('page_not_found.html'), 404 @app.route("/hello/") @app.route("/hello/
") def hello(name=None): return render_template('hello.html', name=name) if __name__ == "__main__": app.run() <!-- page_not_found.html --> sorry, snacky... page not found...
이로서 페이지를 찾을 수 없을 경우, 제가 임시로 작성한 'page_not_found.html' 을 출력하게 되며, 리턴 바로 위에 app.logger.error(error)를 호출하여 에러로그를 출력하고자 함을 알 수 있습니다. 위의 코드가 제대로 작동한다면 에러가 발생할 경우, 에러메세지를 그대로 출력하게 될 것입니다.
실제로 해당 코드를 cmd 창에서 실행하고, 웹브라우저를 실행하여 정상적인 경로로 접근한 경우와, 잘못된 경로로 접근한 경우로 테스트해보았습니다.
< 정상 경로 접근 >
< 비정상 경로 접근 >
또한 위와 같이 비정상 경로로 접근했을 경우, 아래와 같이 cmd 창에서 에러 로그를 출력하는 것 역시 확인할 수 있습니다..
ERROR in hello: 404: Not Found
이처럼 우리는 플라스크를 이용해 단 코드 몇 줄로 에러를 핸들링하고, 에러로그를 출력할 수 있었습니다.