Flask 기초 | Python 웹 프레임워크 시작하기

Flask 기초 | Python 웹 프레임워크 시작하기

이 글의 핵심

Flask 기초에 대한 실전 가이드입니다. Python 웹 프레임워크 시작하기 등을 예제와 함께 설명합니다.

들어가며

”가장 쉬운 Python 웹 프레임워크”

Flask는 간단하고 유연한 마이크로 웹 프레임워크입니다.


1. Flask 시작하기

설치

pip install flask

Hello World

Flask(__name__)요청이 들어오면 어느 함수가 응답할지 연결해 주는 소형 공장을 만드는 단계입니다. @app.route('/')는 “주소 /로 오면 아래 함수를 실행해 문자열을 돌려준다”는 표지판을 붙이는 것과 같습니다.

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, Flask!"

if __name__ == '__main__':
    app.run(debug=True)
# 실행
python app.py

# 브라우저에서 http://localhost:5000 접속

2. 라우팅 (Routing)

기본 라우팅

@app.route('/')
def index():
    return "홈페이지"

@app.route('/about')
def about():
    return "소개 페이지"

@app.route('/user/<username>')
def user_profile(username):
    return f"{username}님의 프로필"

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f"포스트 #{post_id}"

HTTP 메서드

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        return f"로그인 시도: {username}"
    return "로그인 페이지"

3. 템플릿 (Jinja2)

템플릿 사용

# app.py
from flask import render_template

@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)
<!-- templates/user.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{{ name }}님의 페이지</title>
</head>
<body>
    <h1>안녕하세요, {{ name }}님!</h1>
    
    {% if name == '철수' %}
        <p>관리자입니다.</p>
    {% else %}
        <p>일반 사용자입니다.</p>
    {% endif %}
    
    <ul>
    {% for i in range(5) %}
        <li>항목 {{ i }}</li>
    {% endfor %}
    </ul>
</body>
</html>

4. 폼 처리

폼 데이터 받기

from flask import request, redirect, url_for

@app.route('/submit', methods=['GET', 'POST'])
def submit():
    if request.method == 'POST':
        name = request.form.get('name')
        email = request.form.get('email')
        
        # 데이터 처리
        print(f"이름: {name}, 이메일: {email}")
        
        return redirect(url_for('success'))
    
    return '''
        <form method="post">
            <input type="text" name="name" placeholder="이름">
            <input type="email" name="email" placeholder="이메일">
            <button type="submit">제출</button>
        </form>
    '''

@app.route('/success')
def success():
    return "제출 완료!"

5. JSON API

REST API 만들기

from flask import jsonify, request

users = [
    {'id': 1, 'name': '철수', 'age': 25},
    {'id': 2, 'name': '영희', 'age': 30}
]

@app.route('/api/users', methods=['GET'])
def get_users():
    return jsonify(users)

@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = next((u for u in users if u['id'] == user_id), None)
    if user:
        return jsonify(user)
    return jsonify({'error': 'User not found'}), 404

@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.get_json()
    new_user = {
        'id': len(users) + 1,
        'name': data['name'],
        'age': data['age']
    }
    users.append(new_user)
    return jsonify(new_user), 201

6. 세션과 쿠키

세션 사용

from flask import session

app.secret_key = 'your-secret-key'

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    session['username'] = username
    return redirect(url_for('dashboard'))

@app.route('/dashboard')
def dashboard():
    if 'username' in session:
        return f"환영합니다, {session['username']}님!"
    return redirect(url_for('login'))

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))

실전 예제

간단한 블로그 API

from flask import Flask, jsonify, request
from datetime import datetime

app = Flask(__name__)

posts = []

@app.route('/api/posts', methods=['GET'])
def get_posts():
    return jsonify(posts)

@app.route('/api/posts', methods=['POST'])
def create_post():
    data = request.get_json()
    post = {
        'id': len(posts) + 1,
        'title': data['title'],
        'content': data['content'],
        'created_at': datetime.now().isoformat()
    }
    posts.append(post)
    return jsonify(post), 201

@app.route('/api/posts/<int:post_id>', methods=['GET'])
def get_post(post_id):
    post = next((p for p in posts if p['id'] == post_id), None)
    if post:
        return jsonify(post)
    return jsonify({'error': 'Not found'}), 404

if __name__ == '__main__':
    app.run(debug=True)

정리

핵심 요약

  1. Flask: 마이크로 웹 프레임워크
  2. 라우팅: @app.route()
  3. 템플릿: Jinja2, render_template()
  4. API: jsonify(), request.get_json()
  5. 세션: session 딕셔너리

다음 단계

  • Django 기초
  • REST API 설계

관련 글

  • Python 환경 설정 | Windows/Mac에서 Python 설치하고 시작하기