Flask 설치 및 실행

플라스크(Flask)는 가볍고 유연한 웹 프레임워크로, 파이썬(Python) 언어를 기반으로 합니다.

1. 플라스크 설치


1-1. 가상환경 설치

  • 프로젝트 디렉토리로 이동한 후, 파이썬의 가상 환경을 생성합니다. 가상 환경은 프로젝트 별로 독립된 파이썬 환경을 제공하여, 서로 다른 의존성 문제를 방지할 수 있습니다.
Bash
python -m venv myproject
  • -m 옵션은 파이썬 인터프리터가 지정된 모듈을 실행하도록 하는 옵션입니다.
flask-venv
가상 환경 실행 후 프로젝트 파일

1-2. 가상환경 실행

  • 생성된 가상 환경을 활성화합니다. 가상 환경 내에서 파이썬과 pip 명령어를 사용할 수 있게 됩니다.
Bash
cd myproject\Scripts
activate

1-3. 모듈 설치

  • 가상 환경이 활성화된 상태에서 플라스크와 필요한 모듈을 설치합니다.
Bash
python -m pip install --upgrade pip
pip install flask

1-4. Flask 실행

  • 플라스크 애플리케이션을 정의하고 실행합니다. app.py 파일을 프로젝트 루트에 생성하고, 기본적인 라우트를 설정합니다.
  • 또는 FLASK_APP이라는 환경변수의 이름을 파일명으로 변경할 수 있습니다.
Bash
#app.py
from flask import Flask

app = Flask(__name__)

# URL과 플라스크코드를 매핑하는 플라스크 데코레이터
@app.route('/')
def hello():
     return f'Hello, {__name__}'
flask-exe
  • app.py를 프로젝트 파일에 포함한다.
  • 그 뒤 flask 를 실행시키면 __pycache__ 폴더가 생성된다.
flask-result
플라스크 실행결과

1-5. 가상환경 자동으로 들어가기

Bash
@echo off
set FLASK_APP=test
set FLASK_DEBUG=true
#본인 프로젝트 위치\test-flask\myproject\Scripts\activate.bat
  • 위의 파일을 bat파일로 생성하여 자동으로 접속할 수 있게 만든다.
  • 또한 환경변수를 설정하는 명령어를 자동으로 설정한다.
  • 또한 FLASK_APP=test로 지정하였기 때문에 app.py를 test.py로 바꿔서 동작 시켜야 한다.

2. 프로젝트 구조 설정

2-1. test 폴더로 __init__ 실행

  • 프로젝트 폴더에 test 폴더(FLASK_APP으로 지정한 이름)를 생성 후 test.py를 __init__으로 바꾼 뒤 실행한다.
  • __init__.py 파일은 파이썬에서 해당 디렉토리를 패키지로 인식하게 만듭니다. 이를 통해, FLASK_APP 환경 변수로 지정된 test 폴더 안의 애플리케이션을 초기화하고, 프로젝트의 다른 부분에서 쉽게 임포트할 수 있게 합니다.
flask_test 폴더로 __init__
test 폴더와 __init__.py

2-2. views 폴더에서 blueprint 만들기

  • blueprint 란 : 블루프린트는 애플리케이션의 라우트와 관련된 로직을 모듈화하여 관리할 수 있게 해줍니다. 이를 통해 애플리케이션의 구조를 보다 명확하게 할 수 있습니다.
  • blueprint 사용 이유 : 애플리케이션에 새로운 URL 매핑이 추가될 때마다 create_app 함수 내에 라우팅 함수를 계속 추가하는 것은 함수를 길고 복잡하게 만듭니다. 이 문제를 해결하기 위해, URL과 함수의 매핑을 효율적으로 관리할 수 있는 블루프린트를 사용합니다.
Python
# ./views/main_views.py
from flask import Blueprint

bp = Blueprint('main', __name__, url_prefix='/')

@bp.route('/')
def hello():
    return f'Hello, {__name__}'
Python
from flask import Flask

app = Flask(__name__)

def create_app() : #애플리케이션 팩토리 - 플라스크 서버가 실행될 때 가장 최초로 실행되는 생성자 역할을 한다.
     test = Flask(__name__) 

     # 블루 프린트
     from .views import main_views
     test.register_blueprint(main_views.bp)
     
     return test
  • 애플리케이션 팩토리에 register_blueprint 함수를 통해서 blueprint를 등록합니다.
  • create_app 함수를 호출하여 플라스크 어플리케이션 객체를 생성하고, 이 어플리케이션 객체에 블루프린트가 등록됩니다. 그런 다음, 웹 브라우저에서 / 경로에 접속하면 ‘Hello, {name}’이라는 문자열이 표시됩니다.
blueprint
실행 후 프로젝트

3. ORM 생성

  • ORM(object relational mapping) : 데이터베이스에 데이터를 저장하는 테이블을 파이썬 클래스로 만들어 관리하는 기술입니다.
  • 개발자가 쿼리를 직접 작성하지 않아도 파이썬 문법만으로도 데이터베이스를 다룰 수 있습니다.

3-1. orm 설치하기

  • Flask-Migrate는 Flask 애플리케이션에서 SQLAlchemy 모델을 이용한 데이터베이스 마이그레이션을 관리하는 확장 모듈입니다.
Bash
pip install flask-migrate

3-2. 설정 파일 추가하기

  • config.py 파일을 통해 데이터베이스 설정과 애플리케이션 설정을 관리합니다.
Python
# config.py
import os

BASE_DIR = os.path.dirname(__file__)

SQLALCHEMY_DATABASE_URI = 'sqlite:///{}'.format(os.path.join(BASE_DIR, 'test.db'))
SQLALCHEMY_TRACK_MODIFICATIONS = False
  • SQLALCHEMY_DATABASE_URI는 SQLite 데이터베이스를 사용하며, 데이터베이스 파일은 프로젝트 홈 디렉터리의 바로 아래에 위치한 ‘test.db’ 파일로 저장됩니다.
  • SQLALCHEMY_TRACK_MODIFICATIONS 옵션은 SQLAlchemy의 이벤트를 처리하는데 사용합니다.

3-3. ORM 적용하기

  • __init__.py에 ORM 기본 설정 추가합니다.
  • 데이터베이스 모델을 정의하고, Flask-Migrate를 이용하여 데이터베이스 스키마 변경사항을 관리합니다.
Python
# test-flask/__init__.py
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

import config

db = SQLAlchemy()
migrate = Migrate()

def create_app() : #애플리케이션 팩토리 - 플라스크 서버가 실행될 때 가장 최초로 실행되는 생성자 역할을 한다.
     test = Flask(__name__) 
     test.config.from_object(config)
     
     # ORM
     db.init_app(test)
     migrate.init_app(test, db)

     # 블루 프린트
     from .views import main_views
     test.register_blueprint(main_views.bp)

     return test
  • 데이터베이스 초기화
    • flask db init: 데이터베이스 관리를 시작하기 위한 초기 파일들을 자동으로 생성하는 명령어입니다. 이 명령어를 실행하면 migrations 디렉터리가 생성됩니다.
    • flask db migrate: 모델을 새로 생성하거나 변경할 때 사용하는 명령어입니다. 이 명령어를 실행하면 데이터베이스에 적용할 변경 내용을 담은 작업 파일이 생성됩니다.
    • flask db upgrade: 모델의 변경 내용을 실제 데이터베이스에 적용하는 명령어입니다. 이 명령어를 실행하면 migrations 디렉터리에 있는 작업 파일을 실행하여 데이터베이스를 변경합니다.
flask_init_db
데이터베이스 초기화 후 생성 폴더

3-4. 모델 속성 추가하기

Python
# ./test/models.py
from . import db

class Question(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)

class Answer(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    question_id = db.Column(db.Integer, db.ForeignKey('question.id', ondelete='CASCADE'))
    question = db.relationship('Question', backref=db.backref('answer_set'))
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)
  • db는__init__.py 파일에서 생성한 SQLAlchemy의 인스턴스로, 데이터베이스와의 상호작용을 가능하게 합니다.
  • Question 모델에서는 db.Model 클래스를 상속함으로써 SQLAlchemy에게 이 클래스가 DB 모델임을 알려줍니다.
Python
from flask import Blueprint, render_template
from ..models import Question, Answer

#  블루프린트는 여러 URL 라우트를 그룹화하고 관리하는 데 사용
# 'main'이라는 이름의 Blueprint를 생성하고, URL prefix를 '/main'으로 설정합니다.
board = Blueprint('board',__name__, url_prefix="/board")

@board.route("/post") 
def post_list() :
    question_list = Question.query.all() #ORM으로 끌고 옴
    return render_template("question_list.html",question_list=question_list) 


@board.route("/detail/<int:question_id>")
def post_detail(question_id) :
    #detail = Question.query.filter(Question.id==question_id).all()[0]
    #detail = Question.query.get(question_id)
    detail = Question.query.get_or_404(question_id)
    return render_template("post_detail.html",question = detail)
  • render_template : 이 함수는 지정된 템플릿 파일을 HTML로 변환하고, 브라우저에 보내기 전에 Python 코드를 실행하여 변수의 값을 HTML 파일에 삽입할 수 있게 합니다. 즉, 동적인 웹 페이지를 생성할 수 있게 해주는 기능입니다. render_template는 다음의 두가지 주요기능을 수행합니다.
    • 템플릿 파일 찾기: Flask는 templates 폴더 내에 위치한 HTML 템플릿 파일을 찾습니다. 예를 들어, render_template("example.html")templates 폴더 내의 example.html 파일을 찾아서 사용합니다.
    • 템플릿 렌더링: 함수는 템플릿 파일 내에 정의된 Jinja2 템플릿 언어를 사용하여 Python 변수와 표현식을 HTML로 변환합니다. 이 과정에서, render_template 함수에 전달된 추가 인자들은 템플릿 내에서 사용할 수 있는 변수로 변환되어, 동적인 웹 콘텐츠를 생성할 수 있게 됩니다. 예를 들어, render_template("example.html", my_variable=value)example.html 템플릿 내에서 my_variable이라는 이름으로 value 값을 사용할 수 있게 합니다.

3-5. 모델 import

  • view 에 해당 모델을 사용한다고 등록한다.
Python
# views/main_views.py
from flask import Blueprint
from ..models import Question, Answer

.....
  • 수정된 내용을 db에 migration한다.
Python
# init.py의 create_app의 # 블루 프린트에 추가한다.
 from .view import main_views, board_views
 test.register_blueprint(main_views.bp)
 test.register_blueprint(board_views.board)
Bash
flask db migrate
flask db upgrade

4. 플라스크 셸

4-1. 실행하기

  • flask shell 명령으로 실행

4-2. 질문 저장하기

Bash
>>>from models import Question, Answer
>>>from datetime import datetime
>>> q = Question(subject='질문이 무엇인가요?', content='오늘 날씨를 알고 싶습니다.', create_date=datetime.now())
>>> from test import db
>>> db.session.add(q)
>>> db.session.commit()
  • db.session은 데이터베이스와 연결된 세션, 즉 접속된 상태를 의미
  • 커밋을 해주어야 데이터베이스에 데이터가 저장
  • Question.query.all()로 데이터베이스에 저장된 질문을 전부 조회할 수 있다.
Python
detail = Question.query.filter(Question.id==question_id).all()[0]
detail = Question.query.get(question_id)
detail = Question.query.get_or_404(question_id)
Question.query.filter(Question.subject.like('%날씨%')).all()

5. Jinja 템플릿

HTML
{% if 조건문1 %}
    <p>조건문1에 해당하면 실행</p>
{% elif 조건문2 %}
    <p>조건문2에 해당하면 실행</p>
{% else %}
    <p>조건문1, 2 모두 해당하지 않으면 실행</p>
{% endif %}
HTML
{% for item in list %}
    <p>순서: {{ loop.index }} </p>
    <p>{{ item }}</p>
{% endfor %}
HTML
{{ 객체 }}
{{ 객체.속성 }}

flask 설치부터 기본적인 애플리케이션 구조 설정, 블루프린트 사용, ORM을 통한 데이터베이스 관리, 모델 정의 및 마이그레이션, 그리고 Jinja 템플릿 엔진을 활용한 동적 웹 페이지 생성까지의 과정입니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top