참조 : https://wikidocs.net/book/4542
Flask는 대표적인 Micro 웹 프레임워크이다. 최소한의 구성요소와 요구사항을 제공하여 시작하기 쉽고, 확장하기도 쉽다.
짧은 코드만으로 웹 프로그램을 만들 수 있는 것이다.
그러나. 한개의 페이지만을 만들어서 사용하려는 것이 아니기에, DB처리, Routing, form관리 등등
데이터베이스를 처리하는 models.py 파일
파이보 프로젝트는 ORM(object relational mapping)을 지원하는 파이썬 데이터베이스 도구인 SQLAlchemy를 사용한다. SQLAlchemy는 모델 기반으로 데이터베이스를 처리한다. 지금은 모델 기반으로 데이터베이스를 처리한다는 말이 이해되지 않겠지만, 이후 프로젝트를 진행하면 잘 알 수 있을 것이다. 아무튼 지금 여러분이 알아야 할 내용은 파이보 프로젝트에는 ‘모델 클래스들을 정의할 models.py 파일이 필요하다’는 것이다.
서버로 전송된 폼을 처리하는 forms.py 파일
파이보 프로젝트는 웹 브라우저에서 서버로 전송된 폼을 처리할 때 WTForms라는 라이브러리를 사용한다. WTForms 역시 모델 기반으로 폼을 처리한다. 그래서 폼 클래스를 정의할 forms.py 파일이 필요하다.
화면을 구성하는 views 디렉터리
pybo.py 파일에 작성했던 hello_pybo 함수의 역할은 화면 구성이었다. views 디렉터리에는 바로 이런 함수들로 구성된 뷰 파일들을 저장한다. 파이보 프로젝트에는 기능에 따라 main_views.py, question_views.py, answer_views.py 등 여러 가지 뷰 파일을 만들 것이다.
CSS, 자바스크립트, 이미지 파일을 저장하는 static 디렉터리
static 디렉터리는 파이보 프로젝트의 스타일시트(.css), 자바스크립트(.js) 그리고 이미지 파일(.jpg, .png) 등을 저장한다.
HTML 파일을 저장하는 templates 디렉터리
templates 디렉터리에는 파이보의 질문 목록, 질문 상세 등의 HTML 파일을 저장한다. 앞에서 살펴본 파이보 프로젝트 구조에는 index.html 파일만 있다. 하지만 파이보 프로젝트가 진행되면서 question_list.html, question_detail.html과 같은 템플릿 파일을 계속 추가할 것이다.
파이보 프로젝트를 설정하는 config.py 파일
config.py 파일은 파이보 프로젝트를 설정한다. 파이보 프로젝트의 환경변수, 데이터베이스 등의 설정을 이 파일에 저장한다.
Application Factory
Circular Import 문제를 피해야한다.
# __init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
@app.route('/'
def hello():
return 'Hello'
return app
flask에서 pybo라는 폴더를 만든다음, init.py를 만들어서 그 안에 create_app()함수를 세팅해준다.
flask에서는 FLASK_APP = pybo flask run 이라는 명령어를 쓸 수 있는데, 이는 FLASK_APP을 pybo라는 폴더로 실행하라! 라고 받아들인다고 생각하면 된다. 그럼 그 폴더의 init.py에서 create_app()이라는 함수를 찾아 실행시키면서 flask서버가 구동된다고 보면 된다.
Routing
어떤 URL로 들어왔을 때 이에 대하여 어떤 기능을 통해서 어떤 화면을 보여줄것인가? 라는 것을 생각하면된다.
결국은 주어진 input에 대한, 주어진 output을 만드는것처럼 간단하게 생각해도 된다.
하지만 route해줘야하는곳이 많아지기 시작하면 기능별로 함수를 분리해주는것이 좋다.
너무 길어져버리니까 한눈에 잘 들어오지도 않고, 이후 유지보수적인 측면에서 생각해도 기능별로 파일을 관리해주는것이 훨~~씬 시간을 아낄 수 있을테니까!
이때 쓰는것이 app.register_blueprint() 와 Blueprint라는 객체이다.
Blueprint 청사진이라는 표현처럼, 이쪽에 대한 입력들을 한번에 모아서 관리할때 사용하기편하며, 이후 url_for함수에서 blueprint별로 처리를 해줄 수 있으니 더더욱 좋다!
# main_route.py
bp = Blueprint('main', __name__)
@bp.route('/')
def index():
return render_template('index.html')
## create_app():
# 위에 app = Flask(__name__)부터 각종 config설정, db_init이 실행되고 난 후
from kokoa.routes import main_route
app.register_blueprint(main_route.bp)
이렇게 circular import를 피하며 blueprint를 통하여 라우팅을 관리할 수 있다!