Python

[Flask] 웹 애플리케이션 만들기

비번변경 2022. 9. 16. 19:30

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 --app app run

웹 브라우저로 접속하면 아래와 같이 동작함을 확인할 수 있다.

Flask 실행

여기까지 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'

@app.route

동적 URL 생성

@app.route를 통해 경로와 함수를 바인딩할 때, 변수 부분을 <>로 감싸면 동적 URL을 생성할 수도 있다.

@app.route('/users/<username>')
def get_user_info(username):
    return f"username: {username}"

동적 URL 생성

 

변수의 유형 지정

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 페이지가 표시된다.

컨버터 - 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