[DE] Flask

박경국·2022년 2월 21일
0

Data Engineering

목록 보기
13/16
post-thumbnail

파이썬을 이용해 웹 어플리케이션을 만들 수 있도록 돕는 Flask에 대해 정리해보겠습니다.

1. Flask란?

  • Flask는 '마이크로 웹 프레임워크'입니다.
  • 웹 프레임워크란 웹 서비스나 웹 API를 만들 수 있도록 특정한 방법을 제공하는 도구 모음입니다.
  • '마이크로' 웹 프레임워크는 이러한 도구 모음들을 최소한의 크기로 줄였다는 의미입니다. 쉽게 말해, Flask는 최소한의 코드로 완벽하게 동작하는 웹 프로그램을 만들 수 있습니다.

2. Flask로 간단한 웹 어플리케이션 만들기

1) 기본 구조

flask_app
└── __init__.py

from flask import Flask
app = Flask(__name__)

@app.route('/', methods=['POST', 'GET'])
def home():
    return 'Hello World!'
  • __init__은 해당 파일이 포함되어 있는 디렉토리를 하나의 모듈로 만듭니다. __init__이 포함되어 있는 flask_app 파일을 실행하면 __init__이 실행되는 구조입니다.
  • app = Flask(__name__) : 어플리케이션의 이름을 지정합니다. 이 어플리케이션의 이름은 __init__입니다.
  • @app.route('/') : 어플리케이션의 루트 주소입니다. URL에 따라 실행하게 될 함수를 지정합니다. localhost:5000에 엔드포인트인 /가 붙으면 home() 함수가 실행됩니다.
  • home() : 해당 함수에 붙은 앤드포인트로 들어가면 'Hello World!'가 리턴됩니다.
  • methods=['POST', 'GET'] : POST와 GET HTTP Request 메소드를 허용합니다. 그 외의 메소드는 해당 앤드포인트에서 허용되지 않습니다.

2) 어플리케이션 실행하기

#FLASK_APP={환경변수} flask run
FLASK_APP=flask_app flask run
  • flask_app이라는 이름의 flask 어플리케이션을 실행합니다. flask 파일명이 __init__이므로, 해당 파일의 상위 디렉을 환경변수로 설정합니다.
  • 환경변수를 지정하지 않으면 app.py를 기본 어플리케이션으로 인식합니다.

3) Application Factory

  • app 객체를 전역으로 사용하게 되면(즉, app.py 안에 모든 기능을 때려 넣으면) 프로젝트 규모가 커질 수록 순환 참조 오류가 발생할 확률이 높아집니다.
  • 이를 방지하기 위해 Flask documents는 어플리케이션 팩토리 방식을 사용하기를 권장합니다.
from flask import Flask

def create_app():
    app = Flask(__name__)
    @app.route('/')
    def home():
        return 'Hello World!'
    return app
  • create_app이라는 함수 안에 어플리케이션의 기능을 차곡차곡 쌓는 방식을 어플리케이션 팩토리라고 합니다.
  • 지금은 전역 방식과의 차이점을 구분하기 어려울 수 있지만, 다음 절에서 블루프린트까지 정리되면 더 확연히 어플리케이션 팩토리의 기능이 보일 수 있습니다.

4) 블루프린트로 라우트 함수 관리하기

기능이 많아질 수록 라우트도 많아집니다. 이때 라우트를 하나의 파일에 모아서 사용하지 않고 기능별로 나눠서 관리하면 각 기능을 구조적으로 관리할 수 있습니다.

flask_app
├── __init__.py
└── views
    └── main_views.py
    
 # user_routes.py

from flask import Blueprint

bp = Blueprint('main', __name__, url_prefix='/')

@bp.route('/')
def main():
    return 'home page'

@bp.route('/main')
def main():
    return 'main page'
  • main_views.py : main에 해당하는 기능을 views 폴더의 main_views.py에 관리하겠습니다.
  • from flask import Blueprint : Blueprint 모듈을 import합니다.
  • main : 해당 블루프린트의 명칭입니다.
  • __name__ : 외부에서 해당 블루프린트를 import할 때 사용할 이름입니다. 파일명(main_views)을 사용한다는 의미입니다.
  • url_prefix='/ : 해당 블루프린트에 접근하는 앤드포인트를 설정합니다. bp를 사용하는 라우트는 /을 사용해서 접근할 수 있습니다.
  • 그 외에 데코레이션이 붙은 함수의 기능은 앞서 설명한 작동 방식과 같습니다.

이렇게 기능별로 분리한 폴더에서 파일을 따로 만들어준 뒤 팩토리에 해당 블루프린트를 import 합니다.

# __init__.py

from flask import Flask

def create_app():
    app = Flask(__name__)
    
    from .views import main_views
    app.register_blueprint(main_views.bp)
    
    return app
  • from .views import main_views : 현재 위치(.)에 있는 views 폴더에서 main_views 파일을 import합니다.
  • app.register_blueprint(main_views.bp) : import한 main_views 파일을 블루프린트로 등록합니다.

이렇게 블루프린트로 등록한 후에 flask run을 하게 되면 main_views의 기능을 사용할 수 있게 됩니다.

5) 세부 엔드포인트 설정하기

URL로 어플리케이션에 세부 작업을 요청하는 방법을 알아보겠습니다.

@app.route('/id/', defaults={ 'id' : 0 })
@app.route('/id/<id>')
def query_id(id):
    return f"Your Id is {id}"
  • @app.route('/id/<id>') : URL에 localhost:5000/id/ggpark을 입력하면 ggpark이 query_id의 인자로 넘어갑니다. 화면에서는 Your Id is ggpark이라는 결과가 출력됩니다.
  • @app.route('/id/', defaults={ 'id' : 0 } : 사용자로부터 아무런 값을 전달받지 못했을 때 해당 페이지에서는 '0'을 디폴트로 사용자에게 화면을 출력합니다.

이처럼 사용자가 입력/요청하는 값에 따라 특정한 결과를 return하도록 라우트를 설정할 수 있습니다.

0개의 댓글