Flask 블로그 애플리케이션

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Python 의 인기 있는 웹 프레임워크인 Flask 를 사용하여 블로그 애플리케이션을 만드는 과정을 안내합니다. 이 애플리케이션은 모든 블로그 게시물을 나열하고, 로그인한 사용자가 게시물을 생성할 수 있도록 하며, 작성자가 자신의 게시물을 편집하거나 삭제할 수 있도록 합니다.

참고: 코드 파일을 직접 생성하고 환경에서 실행해야 합니다. Web 5000 에서 Flask 서비스 상태를 미리 볼 수 있습니다.

Blueprint 정의

먼저, 블로그를 위한 Blueprint 를 정의합니다. Blueprint 는 관련 뷰 (view) 및 기타 코드를 그룹화하여 구성하는 방법입니다.

## flaskr/blog.py

from flask import Blueprint, flash, g, redirect, render_template, request, url_for
from werkzeug.exceptions import abort

from flaskr.auth import login_required
from flaskr.db import get_db

## Blueprint 는 'blog'로 명명됩니다. 동일한 파일에서 정의됩니다.
## Blueprint 는 정의된 위치를 알아야 하므로 __name__이 두 번째 인수로 전달됩니다.
bp = Blueprint('blog', __name__)

Blueprint 등록

다음으로, Blueprint 를 애플리케이션에 등록합니다.

## flaskr/__init__.py

def create_app():
    app = ...
    ## 기존 코드 생략

    ## app.register_blueprint() 를 사용하여 팩토리에서 Blueprint 를 가져와 등록합니다.
    from . import blog
    app.register_blueprint(blog.bp)
    app.add_url_rule('/', endpoint='index')

    return app

블로그 인덱스 생성

이제 모든 블로그 게시물을 표시하는 인덱스 뷰를 생성해 보겠습니다. SQL JOIN을 사용하여 결과에 user 테이블의 작성자 정보를 포함시킵니다.

## flaskr/blog.py

@bp.route('/')
def index():
    db = get_db()
    posts = db.execute(
        'SELECT p.id, title, body, created, author_id, username'
        ' FROM post p JOIN user u ON p.author_id = u.id'
        ' ORDER BY created DESC'
    ).fetchall()
    return render_template('blog/index.html', posts=posts)

게시물 생성

다음으로, 로그인한 사용자가 새 블로그 게시물을 생성할 수 있도록 하는 뷰를 생성합니다.

## flaskr/blog.py

@bp.route('/create', methods=('GET', 'POST'))
@login_required
def create():
    if request.method == 'POST':
        title = request.form['title']
        body = request.form['body']
        error = None

        if not title:
            error = 'Title is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute(
                'INSERT INTO post (title, body, author_id)'
                ' VALUES (?, ?, ?)',
                (title, body, g.user['id'])
            )
            db.commit()
            return redirect(url_for('blog.index'))

    return render_template('blog/create.html')

게시물 업데이트

이제 작성자가 자신의 게시물을 업데이트할 수 있는 기능을 추가합니다. 코드 중복을 피하기 위해, 게시물을 가져오고 현재 사용자가 작성자인지 확인하는 헬퍼 함수를 생성합니다.

## flaskr/blog.py

@bp.route('/<int:id>/update', methods=('GET', 'POST'))
@login_required
def update(id):
    post = get_post(id)

    if request.method == 'POST':
        title = request.form['title']
        body = request.form['body']
        error = None

        if not title:
            error = 'Title is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute(
                'UPDATE post SET title = ?, body = ?'
                ' WHERE id = ?',
                (title, body, id)
            )
            db.commit()
            return redirect(url_for('blog.index'))

    return render_template('blog/update.html', post=post)

게시물 삭제

마지막으로, 작성자가 자신의 게시물을 삭제할 수 있는 기능을 추가합니다.

## flaskr/blog.py

@bp.route('/<int:id>/delete', methods=('POST',))
@login_required
def delete(id):
    get_post(id)
    db = get_db()
    db.execute('DELETE FROM post WHERE id = ?', (id,))
    db.commit()
    return redirect(url_for('blog.index'))

요약

축하합니다! Flask 를 사용하여 간단한 블로그 애플리케이션을 만들었습니다! 이 애플리케이션은 사용자 인증을 지원하며, 사용자가 자신의 블로그 게시물을 생성, 편집 및 삭제할 수 있도록 합니다.