에러 다루기
errorhandler를 사용하여 HTTP 오류 코드가 나오는 페이지를 정의할 수 있다.
-> 에러코드를 넘겨주지 않으면 200 성공으로 인지함
1
2
3
4
5
6
7
8
9
10
|
from flask import Flask
import requests
app = Flask(__name__)
@app.errorhandler(404)
def page_not_found(error):
return "<h1>404 Error</h1>", 404
|
cs |
->app. errorhandler의 인자로, 특정 에러코드를 받아서, 해당 에러코드일 때 특정 메시지를 출력하도록 에러코드를 다룰 수 있다.
로깅(logging) 다루기
- 서버는 24시간 동작하므로, 문제가 있을 때, 어떤 문제가 있었는지, 파악하기 위해 로깅 기능을 사용함.
- 코드에다가 구현 과정 동안의 내부 통신들을 직접 보고 싶을 때, 로깅 코드를 포스트잇처럼 딱 집어서 표시해 두면,
후에 에러라던가 코드 구현 과정에서 어디에서 에러가 났는 지 등을 눈으로 확인 할 수 있는 기능을 제공한다,
- 따라서, 다양한 상용화시 문제에 대해서 로깅 기능을 자주 활용함.
logging 라이브러리 사용법
- 파이썬에는 로그를 다루는 logging 라이브러리가 있음
- 로딩 정보는 레벨이 있음
-> 로그의 레벨에 따라서 출력을 제한 할 수 있음
-
DEBUG > INFO > WARNING > ERROR > Critical
-
critical로 갈 수록, 그 이슈가 심각한 것이다. 즉 이는 로그파일에 저장되는 레벨을 설정하는 것이다.
-
로그파일에 저장되는 레벨 수준을 정할 수 있는데, 모든 것을 저장하면 실행될때마다 저장하여 메모리 이슈가 발생할 수도 있다. 기본적으로 파이썬에서 로그파일을 사용하기 위헤 전반적으로 사용가능한 라이브러리이다.
로깅 라이브러리는 기본적으로 파이썬에서 로그파일을 사용하기 위헤 사용가능하다.
Logging Level
1
2
3
4
5
6
7
8
9
10
|
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")
|
cs |
DEBUG - 상세한 정보
INFO - 일반적인 정보
WARNING - 예상치 못하거나 가까운 미래에 발생할 문제
ERROR - 에러 로그. 심각한 문제
CRITICAL - 프로그램 자체가 실행되지 않을 수 있음
-
파이썬 로거 레벨 설정에 따라서 하위 레벨은 출력이 안된다.
-
기본 로거 레벨 세팅은 WARNING이기 때문에 설정 없이 INFO, DEBUG를 출력 할 수 없다.
flask 와 logging
- logging 라이브러리와 함께 flask logging 기능 사용 가능
주요 logging 핸들러
- FileHandler : 파일로 로그를 저장
- RotatingFileHandler : 파일로 로그를 저장하되, 파일이 정해진 사이즈를 넘어가면, 새로운 파일로 생성(실무에서 많이 쓰인다.)
-
maxBytes=하나의파일사이즈, backupCount=파일갯수
-
전체 파일을 다 쓰면, 다시 처음부터 씀
-
즉 씨씨티비 저장기한을 생각하면 된다. 최대 사이즈 기준으로 쪼개서 파일들을 만들어서 저장하다가 최대 사이즈가 넘어서 로그 파일이 저장되면, 다시 첫 파일부터 덮어쓰면서 로그 파일을 저장함.
-
NTEventLogHandler - 윈도우 시스템 로그로 남김
-
SysLogHandler - 유닉스 계열 시스템의 syslog 로 남김
서버 상에서는 로그 파일이 전체 디스크를 채울 경우, 비정상동작을 할 수 있으므로 RotatingFileHandler 가 일반적인 경우에는 적합
app.run(host="0.0.0.0", port="8080", debug=True)
- 다음과 같이 작성해서, 상용화시에는 app.debug 를 False 로 놓고, 디버그 정보를 로그로 남기는 것이 일반적임
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
from flask import Flask
import requests
app = Flask(__name__)
if not app.debug:
# 즉 debug=true면 이는 false로서 아래 함수가 돌아간다.
# 실제 상용화단계에서 로깅을 진행해라는 의미이다
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 = true면 개발모드, false면 상용화된 모드
|
cs |
-> 로그 파일이 저장되는 곳은, 프로젝트 실행을 위해 VSC에서 오픈한 해당 폴더를 절대 경로로 두고 로그 파일이 생성된다.
주요한 데코레이터
- before_first_request : 웹 application 기동 이후 가장 처음에 들어오는 HTTP 요청에서만 실행
- before_request : HTTP 요청이 들어올 때마다 실행
=> before_first_request, before_request는 인자를 전달할 수는 없음
- after_request : HTTP 요청 처리가 끝나고 브라우저에 응답하기 전에 실행
=> response 를 리턴해야 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
from flask import Flask
import requests
app = Flask(__name__)
@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>"
if __name__ == "__main__":
app.run(host="0.0.0.0", port="8080")
|
cs |
위의 코드를 실행하면 아래와 같이 프린트문을 출력함.
**데코레이터 추가적인 설명 예시
Reference
'SW Engineering > BE' 카테고리의 다른 글
Flask 서버_flask-bycrypt로 비밀번호 암호화 (0) | 2020.11.19 |
---|---|
Flask 서버구축하기_MVC 패턴(feat. blueprint) (1) | 2020.11.14 |
Flask로 서버 구축하기_REST API(feat. 프론트) (0) | 2020.11.13 |
Flask로 서버 구축하기_Routing기본 (0) | 2020.11.12 |
Flask 개발환경 설정하기(VSC 환경설정) (0) | 2020.11.10 |