Flask
Python으로 작성된 마이크로 웹 프레임워크로, Werkzeug 툴킷과 Jinja2 템플릿 엔진을 기반으로 한다.
Python 웹 프레임워크는 대표적으로 Django와 Flask를 사용한다.
- Django : 풀 스택 프레임워크. 강력한 모듈이 기본적으로 탑재되어 있어 완성도가 높다. 하지만 사용하지 않는 모듈도 포함되어 있어 다소 무겁고, 프레임워크 학습에 시간이 필요하다. 참고로 발음 기호는 ˈdʒæŋɡoʊ(쟹고)로 표기된다.
- Flask : 웹 애플리케이션 개발에 필요한 모듈만 포함된 경량 프레임워크. 다양한 웹 엔진과 붙여 사용할 수 있고, 가벼워 Django와 함께 사용할 수도 있다.
Flask는 코드가 단순하고 API 관련 확장 기능이 많아 API 서버를 만들기에 편리하다.
이 글에서는 Flask를 이용해 간단한 웹 서버를 만들어보려고 한다.
설치
flask는 pip를 이용해 간단히 설치할 수 있다. 웬만하면 venv, conda와 같은 Python 가상 환경을 생성해두고 그 환경에 설치하여 사용하는 것을 권장한다.
pip install flask
이 글의 경우 Pycharm을 사용하고 있어서, 프로젝트 내의 venv에 설치되었다.
기본 구조
공식 문서에서 제공하는 기본적인 Flask 애플리케이션은 다음과 같은 모습이다.
# app.py
# Flask 클래스 임포트
from flask import Flask
# Flask 클래스 인스턴스화. 애플리케이션의 이름을 매개변수로 전달한다.
# 단일 모듈이라면 __name__ 변수를 사용해야 한다.
app = Flask(__name__)
# 어떤 URL로 함수를 실행할지 지정한다.
@app.route('/')
def hello_world():
return 'Hello World!'
# 프로그램 시작점
if __name__ == '__main__':
# 애플리케이션 실행
app.run()
실행
Python으로 실행시켜도 되지만, Flask run 명령으로 실행하는 것을 권한다.
flask run
# --app : 로드할 플라스크 애플리케이션 또는 Factory 함수. 'module:name' 형식이다.
# 이름이 'app', 'application', 'create_app', 'make_app'이라면 적시하지 않아도 된다.
# 예시
flask --app app run
웹 브라우저로 접속하면 아래와 같이 동작함을 확인할 수 있다.
여기까지 Flask를 이용해 웹 서버를 실행해보고 하나의 접점, API 엔드포인트를 만든 셈이다.
💡 엔드포인트
API 서버가 제공하는 통신 채널
API가 서버에서 리소스에 접근할 수 있도록 하는 URL
라우팅
Flask는 @app.route 데코레이터를 이용해 URL과 함수를 바인딩한다. 이를 통해 웹 애플리케이션은 URL 경로에 따라 다른 기능이 동작할 수 있다.
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/users')
def get_users():
return 'users'
동적 URL 생성
@app.route를 통해 경로와 함수를 바인딩할 때, 변수 부분을 <>로 감싸면 동적 URL을 생성할 수도 있다.
@app.route('/users/<username>')
def get_user_info(username):
return f"username: {username}"
변수의 유형 지정
Converter를 사용해 동적 URL의 변수 부분의 유형을 지정할 수 있다. 형식은 <converter:variable_name>로 사용하며, Flask가 제공하는 Converter 유형은 다음과 같다.
Convertor | |
string | 슬래시가 없는 모든 텍스트를 허용합니다(기본값). |
int | 정수를 허용합니다. |
float | int와 비슷하지만 부동 소수점 값에 사용됩니다. |
path | 문자열과 유사하지만 슬래시를 허용합니다. |
예시
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
정수만을 사용하도록 설정한 /post/<int:post_id> 경로에 문자열 데이터로 요청이 들어온 경우, 아래와 같이 Not Found 페이지가 표시된다.
참고 문서
https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html
https://mcauto.github.io/back-end/2018/10/11/how-to-use-flask-restful/
https://rekt77.tistory.com/103?category=825845