DEV/Etc

[Flask] Flask 란?

l-eazzy 2023. 8. 3. 17:35

이번에 파이썬 크롤러를 만들면서 크롤러 트리거로 HTTP 를 이용할까 하여,

파이썬 웹 프레임워크인 플라스크(Flask)에 대해 알아보았다.

 

 

1. Flask?

 

플라스크(Flask)는 파이썬으로 작성된 마이크로 웹 프레임워크의 하나로,

Werkzeug 툴킷과 Jinja2 템플릿 엔진에 기반을 둔다.

 

플라스크 프레임워크를 사용하는 애플리케이션은 핀터레스트, 링크드인 등이 있다고 한다.

 

 

2. Flask VS Django VS FastAPI?

 

전 세계적으로 어느걸 더 많이 검색할까 궁금해서

현재 기준으로 구글 트랜드에 세가지를 비교해보았는데,

 

Django가 가장 높지만 바로 아래 Flask 검색 량이 많았다.

사실 상 요즘 개발자 채용시장에서도 파이썬 기반인 경우 Django 가 더 많이 보이긴 하였다.

 

추세는 추세고,

내가 개발하는 환경은

내꺼니깐 내꺼에 맞는걸 선택하는게 좋다 생각한다.

 

이 글에서 각 차이를 서술 하자면 길어지니 다른 블로거 분이 잘 정리한 글에 대한 링크로 대체하겠다.

(정리 잘해두셔서 한번에 이해 당해버렸다...ㅋㅋ)

 

Django vs Flask vs FastAPI 어떤 걸 사용해야 할까?

프레임워크 동향 아직까지는 github stars, Google Trends를 봐도 Django, Flask가 압도적인 추세이다. Django (장고) Django 프레임워크란? Django는 무료 오픈 소스인 python 웹 프레임워크이다. Adrian Holovaty와 Simon

yscho03.tistory.com

 

이 중에서 Flask 를 고른 이유는 모듈화가 잘 되어 있기 때문이였다.

(특히 Blueprint 기능을 보고 이걸 써봐야겠다 생각이 들었다.)

 

Django는 회사에서도 다른분이 만든 코드 유지보수하느라 잠깐 맛보기 했는데,

구조 자체가 너무 방대해지고 복잡해져서

가독성 측면에서는 Flask가 좀 더 좋아보였기도 했다.

 

 

3. 구현

플라스크를 처음 실행할 때,

 

플라스크 객체(app) 만들고

@app.route("/") 라우트 지정하고 실행할 메소드 만들고

app.run() 하면 끝이다.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

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

 

포스팅 끝!

.

.

.

.

이라고 하면,

위키 백과 보면 끝날 내용이니

 

추가적으로 Blueprint 사용에 대해 적어 보겠다.

(이대로 쓰면 한 파일에 모든 라우트를 적을지도....)

 

 

4. Blueprint?

블루프린트는 보통 대형 어플리케이션이 동작하는 방식을 단순화하고 어플리케이션의 동작을 등록하기 위한 플라스크 확장에 대한 중앙 집중된 수단을 제공할 수 있다.

Blueprint 객체는 Flask 어플리케이션 객체와 유사하게 동작하지만 실제로 어플리케이션은 아니다. 다만 어플리케이션을 생성하거나 확장하는 방식에 대한 블루프린트 이다.

 

a. 특징

  • 어플리케이션을 블루프린트의 집합으로 고려한다. 이 방식은 대형 어플리케이션에 있어서 이상적이다.
    프로젝트는 어플리케이션 객체를 인스턴스화하고, 여러 확장을 초기화하고, 블루프린트의 묶음을 등록할 수 있다.
  • 어플리케이션 상에 URL 접두어와/또는 서브도메인으로 블루프린트를 등록한다.
    URL 접두어와/또는 서브도메인에 있는 파라메터는 블루프린트에 있는 모든 뷰 함수에 걸쳐있는 공통 뷰 인자(기본값을 가진)가 된다.
  • 어플리케이션에 여러 URL 규칙을 가진 블루프린트를 여러번 등록한다.
  • 블루프린트를 통해 템플릿 필터, 정적 파일, 템플릿, 그리고 다른 유틸리티를 제공한다. 블루프린트는 어플리케이션이나 뷰 함수를 구현하지 않아도 된다.
  • 플라스크 확장을 초기화할 이런 경우 어떤 경우라도 어플리케이션에 블루프린트를 등록한다.

 

 

4. 구현

프로젝트 구조는 다음과 같이 만들었다.

 

대략적인 파일 별 설명은

 

runserver.py : 파이썬 프로젝트 실행 파일

app_blueprint.py : 블루프린트 설정 파일

sample_api.py : api 관련 라우트 및 기능 모음

sample_page.py : web page 관련 라우트 모음

 

 

다음으로 구현된 파일 내용을 보도록 하겠다.

 

 

a. app_blueprint.py

from flask import Blueprint, render_template

#: blueprint 관련 세팅
#: web page 라우트 용
page_app = Blueprint('page_app', __name__,
                     template_folder='../templates', static_folder='../static') #: 템플릿 및 스태틱 파일 경로를 미리 지정
#: api 라우트 용
api_app = Blueprint('api_app', __name__, url_prefix='/api') #: prefix로 /api 를 붙이도록 한다.

 

먼저 Blueprint 세팅 파일로,

 

* 템플릿과 스태틱 파일 라우트를 담당할(.html 파일 및 정적 파일) page_app

* API 라우트를 담당할 api_app

 

두 개의 Blueprint 객체를 만들어준다.

(이렇게 만든 의도는 api용, page용으로 나누기 위함이지, 이게 꼭 정답이다는 아닙니다!)

 

여기서 옵션으로 사용한

templat_folder, static_folder 는 각 폴더 경로를 미리 세팅하는 것이고,

url_prefix 는 해당 라우트를 사용할 때, prefix 값으로 /api 를 사용하겠다는 의미이다.

 

설정 가능한 목록은 아래 이미지를 참고해주길 바란다.

 

 

b. app/__init__.py

from flask import Flask, render_template, request, url_for
# from app import routes
from app.routes import *

def create_app():
	#: Flask 객체 생성
    app = Flask(__name__)

    #: BluePrint 세팅
    from app.app_blueprint import page_app, api_app
    app.register_blueprint(api_app)
    app.register_blueprint(page_app)

    print(app.url_map)

    return app

app 패키지의 __init__.py 파일에

create_app() 메소드를 만들어주는데, Flask app의 초기화를 담당한다.

(추가적으로 여기다 config 설정이나, DB 설정 등을 추가할 예정이다.)

 

여기서 Flask app 객체를 생성해주고,

app.register_blueprint() 를 해주는데

 

그냥 blueprint 로 만든 'page_app'이나  'api_app'을 실행하면 되는거 아니야? 라고 생각할 수도 있겠지만

 

위에서 설명했듯이

'Blueprint 객체는 Flask 어플리케이션 객체와 유사하게 동작하지만 실제로 어플리케이션은 아니다.' 부분에서 생각하면 Blueprint는 route 설정에 대한 청사진을 제공한다 보면 된다.

 

 

c. runserver.py

파이썬 애플리케이션을 실행시킬 파일인 runserver.pycreate_app() 메소드를 실행하면 된다.

from app import create_app
# from flask import Flask

if __name__ == '__main__':
    print("Run Back Application!!")
    application = create_app()
    application.run(host='0.0.0.0', port=9000, debug=True)

실행 시에 host, port, debug 유무 등을 설정 할 수 있다.

 

 

여기까지 왔으면 라우트 전까지 온거다.

이제부터는 routes 패키지 폴더 안에 있는 코드를 만들어볼 예정이다.

 

 

d. sample_page.py

from app.app_blueprint import page_app, render_template

@page_app.route('/')
def home():
    return render_template('welcome.html')


@page_app.app_errorhandler(404)
def page_not_found(e):
    return render_template('pages/404.html')

아까 만들었던 app_blueprint에서

page_app 객체를 import 하여서 @page_app.route('경로') 를 지정하여 렌더시킬 페이지 위치를 반환한다.

 

앞서 app_blueprint 에서 templete_folder 를 지정하였기 때문에

그 뒤로부터의 파일 경로를 render_templete()에 적어 반환해주면 된다.

 

@page_app.app_errorhandler(error_code)

해당 에러코드에 대한 정의도 가능하니 사용해보면 좋을것 같다.

 

 

e. sample_api.py

from app.app_blueprint import api_app
from flask import request

@api_app.route("/hello")
def get_hello():
    return "Hello! Stranger!"

이 파일도 반환 형태만 다르게 사용했지 비슷하기에 추가적인 설명은 패스!

 

단! url_prefix 설정으로 /api 를 넣어줬기에 위에 get_hello() 메서드는 /api/hello 경로로 라우트 된다.

 

 

f. routes/__init__.py

routes 패키지 폴더 내에서 만든 파일을 인식 시키기 위해서 아래와 같이 작성해준다.

__all__ = ["sample_api", "sample_page"]

 

 

g. html

아까 sample_page.py 에서 사용한 html 파일이다.

{# welcom page html #}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask Sample Page</title>
</head>
<body>

    <div style="text-align: center">
        <h1>Welcome My Sample Page!</h1>
    </div>

</body>
</html>


{# 404 error page html #}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Not Found Page!</title>
</head>
<body>
    <div style="text-align: center">
        <h1>404 Error!</h1>
        <h3>찾을 수 없는 페이지입니다!</h3>
    </div>

</body>
</html>

 

 

 

5. 실행

드디어 실행해볼 수 있다.

IDE 로 실행하거나, python3 runserver.py 를 하게되면

위에서 작성한 라우트한 경로를 볼수있다.

(작성 경로가 무조건 프린트 되는건 아니고 위에 코드 중 app.url_map 을 프린트 한 부분이 있기에 나오는 것이다.)

 

만든 라우트에 따라

페이지를 가져오냐 데이터를 가져오냐 분리되는것을 볼수있었다.

 

 

 

6. 마무리

이렇게 Blueprint 를 이용해서 각 목적에 따라 분리하여 사용하는걸 테스트해봤다.

플라스크도 문서가 잘되어있는 편이라서 문서를 참고하거나 깃허브에 잘 되어있는 코드를 참고해보는것도 좋을듯하다.

(깃허브에 책 코드 자료로 공개된 소스코드들이 있어서 이번 포스팅도 참고해서 만들었다. 아래 참고 문서에서 확인!)

 

 

8. 깃허브

https://github.com/mk1-p/flask-sample

 

GitHub - mk1-p/flask-sample: Test for Python Flask App

Test for Python Flask App. Contribute to mk1-p/flask-sample development by creating an account on GitHub.

github.com

 

 

8. 참고 문서

https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9D%BC%EC%8A%A4%ED%81%AC_(%EC%9B%B9_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC) 

 

플라스크 (웹 프레임워크) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

https://flask-docs-kr.readthedocs.io/ko/latest/blueprints.html

 

블루프린트를 가진 모듈화된 어플리케이션 — Flask 0.11-dev documentation

블루프린트는 리소스 또한 제공할 수 있다. 때때로 여러분은 단지 리소스만을 제공하기 위해 블루프린트를 사용하고 싶을 수도 있다. 블루프린트 리소스 폴더 보통 어플리케이션처럼, 블루프린

flask-docs-kr.readthedocs.io

https://github.com/wikibook/flask/tree/master

 

GitHub - wikibook/flask: 『파이썬 웹 프로그래밍 : 플라스크를 이용한 쉽고 빠른 웹 개발』 예제 코드

『파이썬 웹 프로그래밍 : 플라스크를 이용한 쉽고 빠른 웹 개발』 예제 코드 . Contribute to wikibook/flask development by creating an account on GitHub.

github.com

 

728x90