- 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.1 은 localhost 이고 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()
'데이터 엔지니어링(DE) > Application과 API' 카테고리의 다른 글
bootstrap (0) | 2021.07.24 |
---|---|
Jinja template (0) | 2021.07.24 |
API / HTTP (0) | 2021.07.24 |
댓글