ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 플라스크(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
    



     이처럼 우리는 플라스크를 이용해 단 코드 몇 줄로 에러를 핸들링하고, 에러로그를 출력할 수 있었습니다.

    댓글

Designed by Tistory.