웹서비스 기술 익히기 - flask 다양한 기능

4. flask 다양한 기능

에러(error)와 로깅(logging)

  • errorhandler를 사용하여 HTTP 오류 코드가 나오는 페이지를 정의할 수 있음
    • return 의 두번째 인자로 에러코드를 넘겨주지 않으면 200 성공으로 인지함
In [ ]:
@app.errorhandler(404)
def page_not_found(error):
    return "<h1>404 Error</h1>", 404
In [ ]:
from flask import Flask 
import requests

app = Flask(__name__)   

@app.errorhandler(404)
def page_not_found(error):
    return "<h1>404 Error</h1>", 404

@app.route("/google")
def get_google():
    response = requests.get("http://www.google.co.kr")
    return response.text 

if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8080")
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
127.0.0.1 - - [04/Apr/2018 21:59:09] "GET / HTTP/1.1" 404 -

로깅 정보는 로그의 레벨에 따라서 출력을 제한 할 수 있습니다.

DEBUG > INFO > WARNING > ERROR > Critical

In [4]:
import logging
# 파일로 남기기 위해  filename='test.log' parameter로 추가한다.
logging.basicConfig(filename='test.log', level=logging.DEBUG)

logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
In [5]:
from flask import Flask 
import requests

app = Flask(__name__)   

@app.errorhandler(404)
def page_not_found(error):
    app.logger.error(error)
    return "<h1>404 Error</h1>", 404

@app.route("/google")
def get_google():
    response = requests.get("http://www.google.co.kr")
    return response.text 

if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8080")
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

anotation



  • before_first_request : 웹 application 기동 이후 가장 처음에 들어오는 HTTP 요청에서만 실행
  • before_request : HTTP 요청이 들어올때마다 실행

    • before_first_request, before_request는 인자를 전달할 수는 없음

  • after_request : HTTP 요청이 끝나고 브라우저에 응답하기 전에 실행

  • teardown_request : HTTP 요청 결과가 브라우저에 응답한 다음 실행
  • teardown_appcontext : HTTP 요청이 완전히 완료되면 실행

프로그램 설정

  • 프로그램들은 일종의 설정 및 구성을 필요
  • Flask 객체의 config 속성을 통해 설정 값 변경 및 설정 가능
  • config 은 실제로는 dictionary 의 서브클래스이며, 다른 dictionary 처럼 다음과 같이 수정 가능
In [ ]:
app = Flask(__name__)
app.config['DEBUG'] = True

다양한 프로그램 설정 방법

In [ ]:
app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')
  • The application can be configured based on configuration file, which is specified by a environment variable
In [ ]:
app.config.from_envvar('YOURAPPLICATION_SETTINGS')


  • use classes for your Flask application configuration:
In [ ]:
app.config.from_object('module_name.DevelopmentConfig')
In [ ]:
class DevelopmentConfig(BaseConfig):
    DEBUG = True
    TESTING = True

bootstrap with flask

blueprint

  • 실제 서비스할 웹서비스는 여러 플라스크 응용프로그램으로 구성될 수 있음
  • 생성된 응용프로그램별로 다른 라우팅 규칙과 정적 파일/템플릿 폴더를 관리
  • 블루프린트별 URL 규칙 설정
  • 블루프린트별 URL 핸들러 설정(before_request등)
  • 블루프린트별 정적 파일 및 템플릿 필터와 폴더 설정


In [ ]:
from flask import Blueprint
from imgdataservice.logger import Log

imgdataservice = Blueprint('imgdataservice', __name__,
                     template_folder='../templates', static_folder='../static')

쿠키와 세션

  • 쿠키 (Pycharm: 04_flask_practices/cookie_html.py)
In [ ]:
from flask import Flask, request, make_response, render_template
app = Flask(__name__)


@app.route('/get')
def get_cookie():
    username = request.cookies.get('username')
    return render_template('variable.html', name=username)


@app.route('/add/<user>')
def add_cookie(user):
    resp = make_response(render_template('simple.html'))
    resp.set_cookie('username', user)
    return resp


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