빨간색코딩

Flask 기초 본문

python

Flask 기초

빨간색소년 2022. 2. 2. 16:29

flask 를 간단히 쓸 용도로, 공식문서를 보고 대강 메모해두었다.

1. 시작하기

  • 설치 : pip install flask
  • hello world : app.py
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        return 'This is Home!'
    
    if __name__ == '__main__':  
        app.run('0.0.0.0',port=5000,debug=True)

2. 라우터

  • 라우터에서 인자 받기
    • GET : request.args.get(매개변수명)
    • POST : request.form[매개변수명]
  • 라우터에서 path 받기
    @app.route('/post/<int:post_id>')
    def show_post(post_id):
        수행문
  • json 반환 : return jsonify({'result':'success', 'data': '...'})
  • url 반환 : url_for 사용
    • 컨텍스트에 따라 상대경로를 알아서 생성해줌
  • 메소드 : @app.route('/login', methods=['GET', 'POST'])
  • 정적 파일 : static 이 기본값으로 특수설정 되어있음.
    • url_for('static', filename='style.css')
    • 템플릿에선 <img src="{{ url_for('static', filename='rome.jpg') }}"/>
  • 리다이렉트 : redirect(url_for('login'))
  • 응답코드별 에러핸들러 : @app.errorhandler(404) def page_not_found(error):
  • 응답 반환 포맷 : (response, status, headers)
    • 문자열이면 알아서 text/html 로 된다
  • 요청 전,후 interceptor : @app.before_request, @app.teardown_request
    • 하나의 요청 내 글로벌 변수인 flask.g 에 보통 바인딩해서 씀

3. 로깅

  • 기본 로거 사용
    app.logger.debug('A value for debugging')
    app.logger.warning('A warning occurred (%d apples)', 42)
    app.logger.error('An error occurred')

4. 템플릿 엔진

  • autoescaping 된다
    • unescape 하려면 {% autoescape false %} ... {% endautoescape %}
  • 템플릿으로 데이터 전달 : return render_template('index.html', key = value)
  • 템플릿에서 데이터 출력 : <div>{{key}}</div>
    • 문장 : {% ... %}
    • 표현식 : {{ ... }}
    • 주석 : {# ... #}
    • 라인문장? : # ... ##
    • 반복문 : {% for i in data %} {{ loop.index }}. {{ i }} {% endfor %}
    • 조건문 : {% if name %} ... {% else %} ... {% endif %}
  • 템플릿 상속 : https://wikidocs.net/81051
    <!-- 부모 -->
    <!doctype html>
    <html>
    <head>
        {% block head %}
        <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
        <title>{% block title %}{% endblock %} - My Webpage</title>
        {% endblock %}
    </head>
    <body>
    <div id="content">{% block content %}{% endblock %}</div>
    <div id="footer">
        {% block footer %}
        &copy; Copyright 2010 by <a href="http://domain.invalid/">you</a>.
        {% endblock %}
    </div>
    </body>
    
    <!-- 자식 -->
    {% extends "layout.html" %}
    {% block title %}Index{% endblock %}
    {% block head %}
    {{ super() }}
    <style type="text/css">
        .important { color: #336699; }
    </style>
    {% endblock %}
    {% block content %}
    <h1>Index</h1>
    <p class="important">
        Welcome on my awesome homepage.
    {% endblock %}
  • custom filter
    • 등록 : @app.template_filter('필터명') def 함수명(매개변수):
    • 사용 : {% for x in mylist | reverse %}
  • context processor
    # .py
    @app.context_processor
    def utility_processor():
        def format_price(amount, currency=u'€'):
            return u'{0:.2f}{1}'.format(amount, currency)
        return dict(format_price=format_price)
    
    # 템플릿
    {{ format_price(0.33) }}

5. 어플리케이션 환경별 설정 방식

  • class 상속 활용
    class Config(object):
        DEBUG = False
        TESTING = False
        DATABASE_URI = 'sqlite://:memory:'
    
    class ProductionConfig(Config):
        DATABASE_URI = 'mysql://user@localhost/foo'
    
    class DevelopmentConfig(Config):
        DEBUG = True
    
    class TestingConfig(Config):
        TESTING = True
    
    config_by_name = dict(
        dev=DevelopmentConfig,
        test=TestingConfig,
        prod=ProductionConfig
    )
  • os.getenv("ENV") 와 같이 가져와서 사용

6. 캐싱

Comments