개요
Python 웹 개발은 초기 CGI 스크립트부터 현재 풀 스택 웹 프레임워크에 이르기까지 오랜 역사를 가지고 있으며 현재 매우 인기 있는 방법이 되었습니다.
파이썬은 1995년(90년대 초)에 웹 개발에 처음 사용되었으며, 이때 CGI 스크립트는 동적 웹 페이지를 작성하는 데 사용되었습니다. Django 프레임워크는 2004년에 출시되었습니다. Django 프레임워크는 많은 기본 기능을 제공하는 고도로 모듈화된 프레임워크로 웹 개발을 더 쉽고 빠르게 만듭니다. 2010년에 출시된 Flask 프레임워크는 더 적은 수의 기본 기능을 제공하는 경량 프레임워크이지만 더 유연하여 개발자가 필요에 따라 기능을 추가하거나 제거할 수 있습니다.
1. 플라스크란?
Flask는 Python용 경량 웹 프레임워크로 사용 편의성과 높은 유연성이 특징입니다. Flask 프레임워크는 웹 애플리케이션을 빠르게 구축할 수 있으며 좋은 선택입니다. Flask 프레임워크의 핵심 아이디어는 웹 서버와 웹 애플리케이션 간의 통신 프로토콜을 정의하는 WSGI(Web Server Gateway Interface)입니다.
1.1 플라스크의 장점
-
사용 용이성: Flask 프레임워크의 API는 사용하기 쉽고 개발자가 빠르게 시작할 수 있습니다. MVC 디자인 패턴.
-
높은 유연성: Flask 프레임워크는 확장성이 높으며 실제 필요에 따라 확장할 수 있습니다.
-
경량: Flask 프레임워크에는 적은 양의 코드가 있고 빠르게 실행됩니다.
-
풍부한 문서: Flask 프레임워크의 문서는 매우 상세하며 개발자는 필요한 정보를 쉽게 찾을 수 있습니다.
1.2 플라스크의 단점
-
경량성: Flask 프레임워크의 경량성도 단점 중 하나이며 기능이 상대적으로 제한되어 자체적으로 확장해야 합니다.
-
대규모 애플리케이션에 적합하지 않음: Flask 프레임워크는 소규모 애플리케이션에 적합하며 대규모 애플리케이션의 경우 성능 병목 현상이 발생할 수 있습니다. 이때 Django를 생각할 수 있다.
1.3 Flask의 기본 구성 요소
Flask 프레임워크는 다음과 같은 기본 구성 요소로 구성됩니다.
-
라우팅: URL과 보기 기능 간의 매핑을 정의합니다.
-
보기 기능: 요청을 처리하고 응답을 반환합니다.
-
템플릿: HTML 페이지를 생성합니다.
-
양식: 사용자가 제출한 데이터를 처리합니다.
-
확장: Flask 프레임워크의 확장 기능을 구현합니다.
2. 기본 사용법
2.1 플라스크 설치
Flask를 사용하기 전에 Flask를 설치해야 합니다. pip 명령을 사용하여 설치할 수 있습니다.
pip install Flask
2.2 헬로월드
다음은 Flask 프레임워크를 사용하여 "Hello World"를 출력하는 방법을 보여주는 간단한 예입니다.
새 app.py 파일을 만들고 다음 내용을 입력합니다.
Linux에서 실행:
내보내기 FLASK_APP=app.py
플라스크 실행
브라우저를 열고 http://127.0.0.1:5000/을 방문하십시오.
Windows 실행인 경우:
FLASK_APP=app.py 설정
플라스크 실행
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
2.3 라우팅 및 보기 기능
Flask에서 라우팅 및 보기 기능은 밀접하게 관련되어 있습니다. 라우팅은 요청을 처리하고 응답을 반환하는 보기 기능에 URL을 매핑하는 데 사용됩니다. 라우팅 및 보기 기능을 구현하기 위해 Flask에서 @app.route
데코레이터를 사용할 수 있습니다. 다음은 간단한 예입니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'This is the index page.'
@app.route('/hello')
def hello():
return 'Hello, World!'
@app.route('/')
@app.route('/hello')
각각 두 개의 경로를 정의하고 두 개의 보기 기능입니다 index()
. hello()
2.4 템플릿
템플릿은 Flask에서 HTML 페이지를 생성하는 방법입니다. Flask는 Jinja2, Mako, Tenjin 등을 포함한 다양한 템플릿 엔진을 지원합니다. 이 기사에서는 Jinja2를 템플릿 엔진으로 사용합니다.
다음은 템플릿을 사용하여 HTML 페이지를 생성하는 방법을 보여주는 간단한 예입니다.
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', title='Home')
@app.route('/hello')
def hello():
return render_template('hello.html', name='Flask')
render_template()
이 함수는 템플릿을 렌더링하는 데 사용되며 첫 번째 매개 변수는 템플릿 이름을 지정하고 두 번째 매개 변수는 템플릿에서 사용되는 변수입니다.
2.5 정적 파일
정적 파일에는 CSS, JavaScript, 이미지 등이 포함됩니다. Flask에서는 url_for()
함수를 사용하여 정적 파일에 대한 URL을 생성할 수 있습니다.
다음은 간단한 예입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{
{ title }}</title>
<link rel="stylesheet" href="{
{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>{
{ title }}</h1>
<p>Hello, Flask!</p>
</body>
</html>
url_for('static', filename='style.css')
정적 파일에 대한 URL이 생성됩니다 style.css
.
2.6 양식
양식은 웹 응용 프로그램에서 일반적인 상호 작용 형식입니다. Flask에서는 request
개체를 사용하여 사용자가 제출한 양식 데이터를 가져올 수 있습니다.
다음은 간단한 예입니다.
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'password':
return 'Login success!'
else:
return 'Invalid username or password.'
else:
return '''
<form method="post">
<label>Username:</label>
<input type="text" name="username">
<label>Password:</label>
<input type="password" name="password">
<input type="submit" value="Login">
</form>
'''
request.form
POST 요청으로 제출된 양식 데이터를 가져올 수 있습니다.
3. 실제 사례: Todo(to-do) 애플리케이션 구축
다음으로 실제 사례를 통해 Flask 프레임워크를 사용하여 Todo 애플리케이션을 구축하는 방법을 소개합니다.
3.1 데이터베이스 설계
먼저 데이터베이스를 설계해야 합니다. 이 문서에서는 MySQL을 데이터베이스로 사용합니다. 데이터베이스 디자인은 다음과 같습니다.
CREATE TABLE `todos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`completed` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 백엔드 구현
다음으로 백엔드의 기능을 구현합니다.
from flask import Flask, render_template, request, redirect, url_for
import pymysql.cursors
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
connection = pymysql.connect(
host='localhost',
user='root',
password='password',
db='todo',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
@app.route('/')
def index():
with connection.cursor() as cursor:
cursor.execute('SELECT * FROM `todos`')
todos = cursor.fetchall()
return render_template('index.html', todos=todos)
@app.route('/add', methods=['POST'])
def add():
title = request.form['title']
with connection.cursor() as cursor:
cursor.execute('INSERT INTO `todos` (`title`) VALUES (%s)', title)
connection.commit()
return redirect(url_for('index'))
@app.route('/toggle/<int:todo_id>', methods=['POST'])
def toggle(todo_id):
with connection.cursor() as cursor:
cursor.execute('SELECT `completed` FROM `todos` WHERE `id` = %s', todo_id)
completed = cursor.fetchone()['completed']
cursor.execute('UPDATE `todos` SET `completed` = %s WHERE `id` = %s', (not completed, todo_id))
connection.commit()
return redirect(url_for('index'))
@app.route('/delete/<int:todo_id>', methods=['POST'])
def delete(todo_id):
with connection.cursor() as cursor:
cursor.execute('DELETE FROM `todos` WHERE `id` = %s', todo_id)
connection.commit()
return redirect(url_for('index'))
구문 분석: 데이터베이스 연결을 설정하고 다음 네 가지 경로를 정의합니다.
-
/
: 모든 할 일을 표시합니다. -
/add
: 할 일을 추가합니다. -
/toggle/
: Todo 완료 여부를 표시합니다. -
/delete/
: Todo를 삭제합니다.
3.3 프런트엔드 구현
마지막으로 프런트 엔드 기능을 구현합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Todo</title>
<style>
.completed {
text-decoration: line-through;
}
</style>
</head>
<body>
<h1>Todo</h1>
<form method="post" action="{
{ url_for('add') }}">
<label>Title:</label>
<input type="text" name="title">
<input type="submit" value="Add">
</form>
<ul>
{% for todo in todos %}
<li{% if todo.completed %} class="completed"{% endif %}>
<form method="post" action="{
{ url_for('toggle', todo_id=todo.id) }}">
<input type="checkbox" name="completed" {% if todo.completed %}checked{% endif %}>
{
{ todo.title }}
</form>
<form method="post" action="{
{ url_for('delete', todo_id=todo.id) }}">
<input type="submit" value="Delete">
</form>
</li>
{% else %}
<p>No todos.</p>
{% endfor %}
</ul>
</body>
</html>
우리는 Jinja2 템플릿 엔진을 사용하여 Todo 목록을 표시하고, Todo를 추가하고, Todo 완료 여부를 표시하고, Todo를 삭제하고 기타 기능을 수행합니다.
4. 기술 요약
오늘은 웹 개발을 위해 Flask 프레임워크를 사용하는 방법을 소개하고 실제로 가벼운 웹 애플리케이션을 개발했습니다. Flask는 Python용 경량 웹 프레임워크로 단순성, 사용 용이성, 높은 유연성의 장점이 있어 초보자도 빠르게 시작할 수 있습니다.