본문 바로가기
데이터 엔지니어링(DE)/Application과 API

Flask

by kiimy 2021. 7. 24.
728x90
728x90
  • Flask 에 대해서 설명할 수 있어야 합니다.
  • Flask 서버를 띄울 수 있어야 합니다.
  • Jinja 템플렛을 사용할 수 있어야 합니다.
  • Bootstrap 을 사용할 수 있어야 합니다.

Flask = Micro Web Framework

파이썬을 사용해 웹 어플리케이션을 작성할 수 있도록 도와준다

 

Web Framework는 웹 어플리케이션을 개발할 수 있도록 웹 서비스 (Web Service) 나 웹 API (Web API) 등을

제공하고 웹 개발과 배포를 할 수 있는 특정 방법을 제공

 

Micro - Flask는 정말 최소한의 도구들을 모아놓은 것

 

기본적으로 프레임워크에 따라 패키지와 라이브러리 등 모듈들의 콜렉션이 있어 개발이 수월할 수 있도록 도와줍니다. Jinja, Werkzeug, Flask-SQLAlchemy 등 다양한 패키지들과 라이브러리들이 존재합니다.

==> sub dependency


1. 폴더 생성 ( __init__.py을 생성하면 폴더자체가 모듈이 됨 )

flask_app ==> 이라는 폴더(패키지)에 __init__.py

└── __init__.py ( Flask(__name__)

 

# name은 flask_app이 됨

 

# __init__.py

from flask import Flask

app = Flask(__name__)

 

# Flask라는 클래스를 app인스턴스로

2. CLI 실행

$ FLASK_APP=flask_app flask run

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

127.0.0.1localhost 이고 5000번 포트에서

3. 라우트 추가하기

# __init__.py

from flask import Flask

app = Flask(__name__)

 

@app.route('/') '127.0.0.1:5000' + '/'

# @app.route('/') 는 어플리케이션의 루트 주소 ('/') 에 접속했을 때에 실행

# URL 에 따라 실행하게 될 함수를 지정하는 역할(= 엔드포인트 (endpoint) 를 설정 )

 

def index():

    return 'Hello World!'

# index 함수가 실행되면서 리턴되는 값 Hello World! 가 웹 페이지에 보여짐

return 값은 무조건 string, dict, tuple... 이어야한다 / 숫자? ==> TypeError 뜸
참고
dict형태로 return하면 웹에선 json 형태로 나옴

 

* 라우터가 여러개 있다면?

Flask 에서는 HTTP Request 를 받고 처리할 때에 가장 먼저 엔드포인트 조건이 맞는 라우트를 사용


HTTP Request 메소드

기본적으로 Flask 의 라우트 데코레이터를 사용하게 되면 3가지 HTTP Request 메소드를 허용합니다.

바로 GET, HEAD, OPTIONS 이죠. 하지만 이외에 POST, PUT, PATCH, DELETE 등 다른 메소드들을 통과하도록 설정하기 위해서는 데코레이터 함수에 methods 라는 인수를 추가

request.get_json('key')
request.args.get('key') # 결과가 같다

만약 key를 이미 알고 있다면(어떤 데이터를 조회하고 싶은 지 안다면)
request.args.get('key') 로 원하는 데이터를 바로 받아올 수 있다.

POST 메서드의 경우, 데이터를 주고받을 때 http body에 들어가기 때문에 form에서 데이터를 전송한다.
request.form['key'] 형식으로 데이터를 받는다.

 

@app.route('/', methods=['POST', 'GET'])

def index():

      ...

라우트 설정할 때 엔드포인트에 꺽쇠 (< >)

URL 을 세부적으로 지정하고 주소에서 값을 전달

@app.route('/index/<num>')

def index_number(num):

      return 'Welcome to Index %i' % int(num)

  • 먼저 <num> 으로 num 이라는 이름의 변수를 만들어 받게 되어있습니다. 따라서 사용자가 입력하는 값과 상관없이 변수로 받게 됩니다. 만약에 index/hello 를 넘겨주면 hello 가 값이 되겠죠? 따라서 변수의 타입을 신경써야 하기도 합니다.
  • 다음은 int(num) 으로 들어오는 변수값을 타입 변환해주고 있습니다. 그 이유는 기본적으로 URL 을 통해 들어오게 되는 값은 문자열 타입이기 때문입니다. 따라서 숫자로 표현하기 위해서는 변환해주는 작업이 필요합니다.처음부터 받을 때에 타입을 지정할 때에는 이렇게 표기할 수도 있습니다 @app.route('/index/<int:num>')

블루프린트 사용하기

블루프린트는 Flask 에서 여러 개의 라우트를 한 곳에 묶어둘 수 있는 기능이 있습니다.

flask_app

├── __init__.py

└── routes

        └── user_routes.py # flask_app이라는 폴더 안에 있어야함

# user_routes.py

 

from flask import Blueprint

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

 

@bp.route('/')= '127.0.0.1:5000' + '/user' + '/'

def index():

      return 'User index page'

  • 'user' : 블루프린트의 명칭( 아무거나 설정 )
  • __name__ : 블루프린트의 import 이름 (변수로 할당한 bp로 import)
  • url_prefix='/user' : URL 접두어 설정 (해당 블루프린트의 라우트는 URL 앞에 '/user' 가 자동으로 붙게 됩니다.)
  • ==> 기본적으로 /user가 붙고 @bp.route('/') = 그다음에 '/'가 나온다

== > __init__.py 파일에서 해당 파일을 불러와서 사용

 

# __init__.py

from flask import Flask

from flask_app.routes import user_routes

 

app = Flask(__name__)

app.register_blueprint(user_routes.bp)

 

@app.route('/')

def index():

     return 'Hello World!'


Application Factory

파이썬에서 circular import 를 피하기 위해서 Flask 에서는 어플리케이션 팩토리 패턴을 추천

circular import == 두 개의 모듈이 서로를 참조하는 경우 발생

여러 개의 어플리케이션을 동시에 사용하거나 app 이 선언되어 있는 파일의 일부분만 필요할 때에도 문제가 발생

==> 잠재적인 문제점들을 피하기 위해 사용되는 방법이 함수를 따로 만드는 것

# __init__.py 파일

from flask import Flask

def create_app():
    app = Flask(__name__)

    from yourapplication.views.admin import admin
    from yourapplication.views.frontend import frontend
    app.register_blueprint(admin)
    app.register_blueprint(frontend)

    return app

if __name__ == "__main__":
  app = create_app()
  app.run()

 

728x90

'데이터 엔지니어링(DE) > Application과 API' 카테고리의 다른 글

bootstrap  (0) 2021.07.24
Jinja template  (0) 2021.07.24
API / HTTP  (0) 2021.07.24

댓글