섹션 7. 다양한 flask 백엔드 기능

  • flask 다양한 기능

flask 다양한 기능

에러 다루기

@app.errorhandler 안에 status code를 작성하고, 그 때 어떤 동작을 할 지 지정할 수 있다.

@app.errorhandler(404) # 존재하지 않는 페이지를 요청했을 때의 에러
def page_not_found(error):
    return "<h1>404 Error</h1>", 404 # 에러 코드를 함께 보낼 수도 있다

기존의 NOT found 대신 설정한 문구가 뜨는 것을 확인할 수 있다. render_template을 이용하여 만들어둔 다른 페이지를 뜨도록 하는 것도 가능하다.

로그 다루기

서버는 24시간 동작하므로, 문제가 있을 때 어떤 문제가 있었는 지 파악하기 위해 로깅 기능을 사용하며, 파이썬에는 로그를 다루는 logging 라이브러리가 있다. 사용자 모니터링, 해킹 확인 든 다양한 문제에 대해서도 활용할 수 있다. (상용화 단계에서 필요)

logging 라이브러리 사용법

로깅 정보는 로그의 레벨에 따라 출력을 제한할 수 있으며, 로그 레벨은 다음과 같이 구성된다

  • DEBUG > INFO > WARNING > ERROR > CRITICAL
import logging
# 파일로 남기기 위해서는 filename='test.log' 파라미터, 어느 로그까지 남길 것인지를 level 로 설정 가능
logging.basicConfig(filename='test.log', level=logging.ERROR)

# 로그를 남길 부분에 다음과 같이 로그 레벨에 맞추어 출력해주면 해당 내용이 파일에 들어감
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
주요 logging 핸들러
  • File Handler : 파일로 로그를 저장
  • RotatingFileHandler : 파일로 로그를 저장하되, 파일이 정해진 사이즈를 넘어가면, 새로운 파일로 생성. maxBytes(하나의 파일 사이즈), backupCount(파일 개수)로 구성되며, 전체 파일을 다 쓰면, 처음부터 다시 작성함
    *최근의 정보를 저장
  • NTEventLogHandler : 윈도우 시스템 로그로 남김
  • SysLogHandler : 유닉스 계열 시스템의 syslog로 남김


* 로그 파일이 전체 디스크를 채울 경우, 서버가 비정상 동작을 할 수 있으므로, RotatingFileHandler가 일반적인 상황에서 적합

debug = True 로 설정되어있을 경우, 로깅을 진행하지 않아도 화면에서 상세 정보가 보여지므로 개발 / 테스트 시 사용되며, 상용화 시에는 app.debug를 False로 놓고 디버그 정보를 로그로 남긴다

from flask import Flask
import requests

app = Flask(__name__)

if not app.debug:
    import logging
    from logging.handlers import RotatingFileHandler  # logging 핸들러 이름을 적어줌
    file_handler = RotatingFileHandler(
        'dave_server.log', maxBytes=2000, backupCount=10)
    file_handler.setLevel(logging.WARNING)  # 어느 단계까지 로깅을 할지를 적어줌
    # app.logger.addHandler() 에 등록시켜줘야 app.logger 로 사용 가능
    app.logger.addHandler(file_handler)


@app.errorhandler(404)
def page_not_found(error):
    app.logger.error('이것은 중요한 에러입니다. page_not_found에서 일어났습니다.')
    return "<h1>해당 경로에 맞는 웹페이지가 없습니다. 문제가 지속되면, 죄송하지만 관리자에게 연락해주세요</h1>", 404


if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8080", debug=False)

위의 코드가 포함된 파일에서 debug=False 이기에, 아래와 같이 에러가 발생했을 때 다음과 같이, dave_server.log라는 이름의 로그 파일이 생성된다. (debug = True 일 때에는 생성되지 않음)

다양한 데코레이터

before_first_request : 웹 애플리케이션 기동 이후 가장 처음에 들어오는 HTTP 요청에서만 실행. 인자 전달 불가능

before_request : HTTP 요청이 들어올 때마다 실행. 인자 전달 불가능

after_request : HTTP 요청 처리가 끝나고 브라우저에 응답하기 전에 실행하며, response를 리턴해야 함

@app.before_first_request
def before_first_request():
    print("flask 실행 후 첫 요청 때만 실행")

@app.before_request
def before_request():
    print("HTTP 요청이 들어올 때마다 실행")

@app.after_request
def after_request(response):
    print("HTTP 요청 처리가 끝나고 브라우저에 응답하기 전에 실행")
    return response

@app.route("/hello")
def hello():
    print('hello')
    return "<h1>Hello Flask!</h1>"

위 코드를 실행시킨 후, /hello 로 접근하면, 다음과 같은 문구가 터미널에 표시된다.

태그:

카테고리:

업데이트: