HAZEL

[ Flask 01. ] Flask실행, MVC, Model, SQLAlchemy, Jinja2 본문

PROGRAMMING/Flask

[ Flask 01. ] Flask실행, MVC, Model, SQLAlchemy, Jinja2

Rmsid01 2021. 8. 16. 11:53
  • FastCampus 파이썬 웹 개발 올인원 패키지 Online. 강의 중, Framework Flask 기초 part 를 듣고 정리한 글입니다.

1. 프레임 워크란?

: 자주 사용되는 코드를 체계화하여 쉽게 사용할 수 있도록 도와주는 코드 집합

: 라이브러리와 혼동 될 수 있지만, 좀 더 규모가 크고 프로젝트의 기반이 됨. 따라서, 쉽게 바꿀수 없는 단점이 있음. 

 

2. Flask 실행 하기

: Flask 는 마이크로 프레임워크라고 불리며, 조금 가벼운 프레임워크라고 불린다. 

: Flak는 MVC 패턴을 직접 제공하지는 않지만, Flask를 이용해서도 MVC 패턴을 이용해서 만들 수도 있다.

작은 프로젝트를 만들때는, 굳이 사용하지 않아도된다. 

 

환경 설정을 하고 나서, Flask 라이브러리를 설치한 다음,

 

간단한 예제 코드를 작성한다.

import os
from flask import Flask

app = Flask(__name__)
@app.route('/')
def hello():
    return 'Hello Flask project '

 

아래와 같이 플라스크를 실행하면, 

(flask_project) leehjung01:project hwajeong$ FLASK_APP=app.py flask run

아래와 같이 http://127.0.0.1:5000/ 라는 주소가 보이는데 그곳으로 들어가면, 내가 만든 'hello'가 보이는 것을 확인 할 수 있다. 

 

3. MVC 는 디자인 패턴 중 하나

- Model : 데이터 베이스와 연결되는 부분

- View : 클라이언트가 보는 부분

- Controller : 접근 url에 따라 비즈니스 로직이 수행되는 부분 

 

4. SQLAlchemy 

: 모델 부분을 지원해주는 라이브러리, ORM 이라고 부름.

: 데이터베이스에서 sql 쿼리를 사용해야하는데, 파이썬 안에서 그냥 객체로 사용할 수 있게 도와주는 라이브러리

 

 

1 ) SQLAlchemy 설치 하기

(flask_project) leehjung01:project hwajeong$ pip install flask-sqlalchemy

 

2 ) 설정해야하는 것 들 설정하기

a. 현재 있는 파일의 dir 와 db 파일위치를 변수에 저장하기

basedir = os.path.abspath(os.path.dirname(__file__)) # 현재 있는 파일의 dir
dbfile = os.path.join(basedir,'db.sqlite')

 

b. SQLALCHEMY_DATABASE_URI

: 사용하는 데이터 베이스에 따라서 아래의 형태가 달라지게 된다.

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile

 

c. SQLALCHEMY_COMMIT_ON_TEARDOWN

: TEARDOWN : 사용자가 웹사이트에 요청되고, 사용자에게 원하는 정보를 줬다면, 그 순간 나오는게 TEARDOWN 이다.
: COMMIT -> 그럼 teardown 하는 순간, commit 을 한다는 뜻. 데이터 베이스에 반영하고 싶은것을 실제로 반영하는 것이다.
: True로 해놔야 놓치는 것 없이 저장 할 수 있다.

app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

 

d. SQLALCHEMY_TRACK_MODIFICATIONS

: 2.x 넘으면, 들어왔는데 이 메시지를 설정하지 않으면 warning message 가 나옴

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

 

3) SQLAlchemy 를 이용해서, 데이터 베이스 를 만들고 연결하기

: 아래의 Test 클래스는 하나의 모델이 됨. 클래스를 통해서 데이터를 넣고, 빼고 할 수 있다.
: 데이터의 모습은 클래스의 변수로 만들게 되며, 내부적으로 데이터베이스의 테이블 명도 지정할 수 있다.
: 이렇게 아래와 같이 코드를 만들어 주면, 넣고 빼는 것은 SQLAlchemy 가 알아서 해준다.

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

class Test(db.Model):
    __tablename__ = "test_table"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)

db.create_all()

@app.route('/')
def hello():
    return 'hello world'

 

4 ) 실행하기

: 아래와 같이 터미널을 실행하면, db.sqlite 가 만들어진다. 

(flask_project) leehjung01:project hwajeong$ python app.py

 

5 ) 실제로 어떤 데이터가 들어가있는지 확인하기

: sql 로 직접 코드를 짠것은 아니지만,  SQLAlchemy 가 알아서 만들어준것을 확인 할 수 있다. 

 

5. Jinja2

: 플라스크를 설치 할 때 같이 설치되는 것으로 플라스크 내부에도 jinja를 사용하고 있어서, 직접사용할 일은 사실 별로 없다.

: 컨트롤러를 작성하게 끔 도와주는 것

 

1번에서 작성한 코드를 보면, 아래처럼, def hello() 에, return 값으로 직접 문자열을 받아준다.

import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello Flask project '

 

하지만, 이 이부분을 HTML 로 변경해주어, Controller 부분과 View 부분을 구분시켜주도록 할 것이다.

그렇게 하는 방법은 간단하다.

 

1. from flask import render_template 로 라이브러리를 import 해준다.

2. html 파일을 templates 폴더 아래 넣어준다.

3. 그 다음. return 에 문자열이 아니라, 이미 만들어둔 html 파일을 대신 넣어준다.

import os
from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route('/')
def hello():
    return render_template('Test.html')