Flask - 기본 개념
개요
파이썬으로 작성된 웹 프레임워크로, 웹 애플리케이션을 쉽게 개발할 수 있도록 돕는 도구이다. 핵심 기능만을 포함하며, 필요 기능은 확장을 통해 필요할 때마다 추가할 수 있다는 특징으로 “마이크로 프레임워크” 라고 불리기도 한다. (여기서 핵심 기능이란 웹 애플리케이션을 개발하는 데 필수적인 최소한의 기능을 의미)
특징
특징
1. 경량 프레임워크
앞서 설명했듯 최소한의 핵심 기능만을 포함하고 있으며, 필요에 따라 확장을 추가하여 기능을 늘릴 수 있다.
from flask import Flask # Flask 클래스를 가져옴
app = Flask(__name__) # Flask 애플리케이션 인스턴스를 생성
@app.route('/') # 루트 URL에 대한 라우트를 설정
def home():
return 'Hello, Flask!' # 해당 URL에 접근하면 'Hello, Flask!'를 반환
if __name__ == '__main__':
app.run(debug=True) # 개발 서버를 시작, debug=True로 설정하면 디버그 모드가 활성화
2. 간단한 문법
플라스크는 파이썬의 간결하고 직관적인 문법을 따르며, 코드가 읽기 쉽고 유지보수가 용이하다.
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def home():
return 'Welcome to the home page!'
@app.route('/greet/<name>') # URL 경로에 변수를 포함시킬 수 있다
def greet(name):
return f'Hello, {name}!'
@app.route('/submit', methods=['POST']) # POST 메서드만 허용
def submit():
data = request.form['data'] # 폼 데이터를 가져옴
return f'You submitted: {data}'
if __name__ == '__main__':
app.run(debug=True)
3. Jinja2 템플릿 엔진
플라스크는 Jinja2 템플릿 엔진을 사용하여 동적 HTML 페이지를 생성할 수 있다.
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html') # 'index.html' 템플릿을 렌더링
if __name__ == '__main__':
app.run(debug=True)
- Jinja Template
python flask 패키지에 내장된 템플릿 엔진으로, 웹 페이지가 동적으로 반응해야 될 부분을 JS가 아닌 Python코드와 유사한 방식으로 작성하여 구현할 수 있다. 또한 고정적으로 출력되어야 할 서식 html코드가 존재하고 동적으로 변해야할 자리는 jinja2문법으로 비워두고, 이후 클라이언트가 웹 브라우저를 통해 엔드포인트에 접근하면 아까 비워둔 자리에 값을 설정하여 클라이언트에게 출력한다. (이처럼 고정적인 행위와 변해야할 행위를 쉽게 할 수 있다는 장점이 있다.)
4. 유연성과 확장성
다음은 SQLAlchemy를 사용하여 데이터베이스 연동 기능을 추가한 예시이다.
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) # Flask 애플리케이션 인스턴스를 생성
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' # 데이터베이스 URI를 설정
db = SQLAlchemy(app) # SQLAlchemy 인스턴스를 생성하고 Flask 애플리케이션에 연결
# 데이터베이스 모델을 정의
class User(db.Model):
id = db.Column(db.Integer, primary_key=True) # 기본 키 열
username = db.Column(db.String(80), unique=True, nullable=False) # 사용자 이름 열
def __repr__(self):
return f'<User {self.username}>'
@app.route('/')
def home():
return 'Database setup complete!'
if __name__ == '__main__':
db.create_all() # 데이터베이스와 테이블을 생성
app.run(debug=True) # 개발 서버를 시작
MVT모델
플라스크는 전통적인 Model-View-Controller(MVC) 아키텍처와 유사한 Model-Template-View(MTV) 아키텍처를 채용하고 있다. Model, View, Template은 각각 다음과 같은 기능을 가진다.
1. Model(모델)
데이터베이스와 상호 작용하며 데이터의 구조와 비즈니스 로직을 정의한다. 보통 SQLAlchemy 같은 ORM을 사용하여 데이터베이스 테이블과 매핑되는 파이썬 클래스로 정의된다. (※ORM - Object-Relational Mapping의 약자로, 객체와 관계형 데이터베이스 간의 데이터를 변환하거나 매핑하는 기술을 말함)
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.username}>'
- User 클래스는 users 테이블과 매핑된다. 각 사용자는 id, username, email 속성을 가지며, 데이터베이스에서 각 열(column)에 해당한다.
2. Template(템플릿)
사용자에게 보여질 HTML을 생성하는 역할을 하며, Jinja2 템플릿 엔진을 사용하여 동적으로 데이터를 출력할 수 있다. (쉽게 말해 입출력 담당)
<!doctype html>
<html>
<head>
<title>User List</title>
</head>
<body>
<h1>User List</h1>
<ul>
{% for user in users %}
<li>{{ user.username }} - {{ user.email }}</li>
{% endfor %}
</ul>
<form method="POST" action="/add_user">
<input type="text" name="username" placeholder="Username" required>
<input type="email" name="email" placeholder="Email" required>
<button type="submit">Add User</button>
</form>
</body>
</html>
- 템플릿에서는 users라는 변수를 통해 사용자 리스트를 받아와서 반복문을 통해 각 사용자의 username과 email을 출력하며, 사용자를 추가할 수 있는 폼을 제공한다.
3. View(뷰)
클라이언트의 요청을 처리하고 데이터를 처리한 후 템플릿을 렌더링하여 반환한다. (입력을 받아 Model과 Template 제어)
# app.py
from flask import Flask, render_template, request, redirect
from models import db, User
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
# 데이터베이스와 테이블 생성
with app.app_context():
db.create_all()
@app.route('/')
def home():
# 모든 사용자를 데이터베이스에서 가져옴
users = User.query.all()
return render_template('home.html', users=users)
@app.route('/add_user', methods=['POST'])
def add_user():
# POST 요청을 통해 받은 데이터로 새로운 사용자를 추가
username = request.form['username']
email = request.form['email']
new_user = User(username=username, email=email)
db.session.add(new_user)
db.session.commit()
return redirect('/') # 추가 후 홈 페이지로 리다이렉트
if __name__ == '__main__':
app.run(debug=True)
- app.py 파일에서는 Flask 애플리케이션을 생성하고 데이터베이스 설정을 한다.
- home() 함수는 / 경로로 들어온 요청을 처리하여 모든 사용자를 데이터베이스에서 가져와 home.html 템플릿에 전달
- add_user() 함수는 /add_user 경로로 POST 요청을 처리하여 새로운 사용자를 데이터베이스에 추가하고, 추가 후에는 홈 페이지(/)로 리다이렉트
4. 동작 흐름
Step1. 사용자가 웹 브라우저를 통해 애플리케이션의 URL에 접속 (사용자 요청)
Step2. 요청에 따라 적절한 뷰 함수가 실행되어 데이터베이스에서 필요한 데이터를 가져온다. (뷰 처리)
Step3. 뷰 함수는 데이터를 템플릿에 전달하여 HTML을 생성 (템플릿 렌더링)
Step4. 생성된 HTML이 사용자에게 보여지고, 사용자는 폼을 통해 데이터를 입력하고 추가할 수 있다. (사용자 응답)