Type Here to Get Search Results !

flask 댓글 기능 만들기

이 글에서는 flask를 통해 댓글 기능을 구현하는 방법에 대해서 설명합니다. 

flask 이미지


댓글 기능 만들기


블루프린트를 사용하여 댓글 기능을 구현하려면 다음 단계에 따라서 작성합니다.

  1. 모듈 구조 생성 후, 라이브러리 설치:

yourapp/

    ├─ main/

    │   ├── __init__.py

    │   └── main_routes.py

    ├── comments/

    │   ├── __init__.py

    │   ├── comments_routes.py

    │   └── templates/

    │       └── comment_section.html

    ├── app.py

    ├── demand.db

    └── config.py


pip install Flask Flask-SQLAlchemy


  1. config.py를 작성합니다.

python

import os


class Config:

    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'

    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \

        'sqlite:///comments.db'

    SQLALCHEMY_TRACK_MODIFICATIONS = False


SECRET_KEY: Flask 애플리케이션에서 사용하는 비밀 키입니다. 이 키는 서버에서 클라이언트로 전달되는 세션을 암호화하기 위해 사용됩니다. 이 변수에는 가능한 한 복잡하고 무작위한 값이 들어가야 하며, 외부에 노출되지 않도록 주의해야 합니다. 코드에서는 환경 변수 'SECRET_KEY'의 값을 사용하거나 기본값으로 'you-will-never-guess'를 사용합니다. 실제 애플리케이션에서는 더 강력한 비밀 키를 사용해야 합니다. SQLALCHEMY_DATABASE_URI: Flask-SQLAlchemy 확장을 통해 구성된 SQLAlchemy 라이브러리와 데이터베이스를 사용하기 위한 데이터베이스 URI입니다. 이 설정은 다양한 데이터베이스 시스템을 지원합니다('sqlite', 'postgresql', 'mysql' 등). 코드에서는 환경 변수 'DATABASE_URL'의 값을 사용하거나 기본값으로 'sqlite:///comments.db'를 사용합니다. 여기서 'comments.db'는 SQLite 데이터베이스 파일의 이름입니다. SQLALCHEMY_TRACK_MODIFICATIONS: SQLAlchemy 이벤트 시스템의 데이터베이스 객체 변경 추적을 활성화 또는 비활성화합니다. 이 설정은 보통 False로 설정되어 리소스 사용을 줄입니다. 데이터베이스 객체 변경에 따른 이벤트를 추적할 필요가 없는 경우 사용됩니다. 애플리케이션에 맞게 다음 값을 설정할 수 있습니다: SECRET_KEY: 외부에 노출되지 않고 복잡한 문자열을 사용하십시오. SQLALCHEMY_DATABASE_URI: 원하는 데이터베이스 및 연결 정보를 지정하십시오. 예를 들어, PostgreSQL 데이터베이스에 연결하려면 'postgresql://username:password@localhost/db_name'와 같은 형식을 사용하십시오. SQLALCHEMY_TRACK_MODIFICATIONS: 필요에 따라 이 값을 True로 설정하여 객체 변경을 추적하도록 설정할 수 있지만, 일반적으로 False로 유지하는 것이 좋습니다.


  1. app.py를 작성합니다.

python

from flask import Flask

from config import Config

from main import main_bp

from comments import comments_bp


app = Flask(__name__)

app.config.from_object(Config)


app.register_blueprint(main_bp)

app.register_blueprint(comments_bp, url_prefix='/comments')


if __name__ == "__main__":

    app.run(debug=True)


  1. yourapp/main/__init__.py 및 yourapp/main/main_routes.py(이미 존재하는 index.html 템플릿이 로드되도록 합니다)를 작성합니다.

python

# yourapp/main/__init__.py

from flask import Blueprint


main_bp = Blueprint('main', __name__)


from . import main_routes


python

# yourapp/main/main_routes.py

from flask import render_template

from . import main_bp


@main_bp.route("/")

def index():

    return render_template('index.html')


  1. yourapp/comments/__init__.py 및 yourapp/comments/comments_routes.py를 작성합니다.

python

# yourapp/comments/__init__.py

from flask import Blueprint


comments_bp = Blueprint('comments', __name__)


from . import comments_routes


python

# yourapp/comments/comments_routes.py

from flask import render_template, request, redirect, url_for

from flask_sqlalchemy import SQLAlchemy

from . import comments_bp


db = SQLAlchemy()


class Comment(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    content = db.Column(db.String(200), nullable=False)


@comments_bp.route("/comment_section", methods=["GET", "POST"])

def comment_section():

    if request.method == "POST":

        comment_content = request.form["content"]

        new_comment = Comment(content=comment_content)


        try:

            db.session.add(new_comment)

            db.session.commit()

            return redirect(url_for('comments.comment_section'))

        except:

            return "Error adding comment"

    else:

        comments = Comment.query.order_by(Comment.id).all()

        return render_template("comment_section.html", comments=comments)


  1. 댓글 영역을 나타내는 템플릿 파일 yourapp/comments/templates/comment_section.html를 생성합니다.

html

<!doctype html>

<html>

  <head>

    <title>Comment Section</title>

  </head>

  <body>

    <h1>Comments</h1>

    <form method="POST" action="{{ url_for('comments.comment_section') }}">

      <textarea name="content" rows="5" required></textarea><br>

      <input type="submit" value="Post Comment">

    </form>

    <hr>

    {% for comment in comments %}

      <p>{{ comment.content }}</p>

      <hr>

    {% endfor %}

  </body>

</html>


  1. 기존 index.html에 댓글 섹션 삽입을 위해 다음 코드를 추가합니다.

html

{% block comments %}

{% include "comment_section.html" %}

{% endblock %}


  1. 최초 실행 전에 데이터베이스 초기화합니다. 실행 전에 Python 인터프리터를 통해 아래 코드를 입력합니다.

python

from yourapp.comments.comments_routes import db

from yourapp.app import app


with app.app_context():

    db.create_all()


이렇게 하면 기존 웹 페이지에 댓글 섹션을 추가할 수 있습니다. 필요에 따라 스타일 및 기능을 추가하거나 조정할 수 있습니다.

여기에 코드 삽입

 페이지 별 댓글 기능 만들기


각 페이지에서 독립적인 댓글을 처리하려면, 댓글 모델에 페이지 정보를 포함하는 필드를 추가하고 페이지별로 댓글을 필터링하는 방식으로 수정할 수 있습니다. 다음 단계를 따라 진행하세요.

yourapp/comments/comments_routes.py에서 Comment 모델에 page 필드를 추가합니다.

python

class Comment(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    content = db.Column(db.String(200), nullable=False)

    page = db.Column(db.String(100), nullable=False)

페이지 정보를 댓글을 추가하는 라우트에 전달합니다. 예를 들어, yourapp/main/main_routes.py에서 페이지 이름을 매개변수로 추가합니다.

python

@main_bp.route("/<page_name>")

def index(page_name):

    return render_template('index.html', page_name=page_name)

댓글 섹션을 로드할 때 page_name으로 필터하는 코드를 추가합니다. 이 예에서는 yourapp/comments/comments_routes.py에 페이지 이름을 기반으로 댓글을 처리합니다.

python

@comments_bp.route("/comment_section/<page_name>", methods=["GET", "POST"])

def comment_section(page_name):

    if request.method == "POST":

        comment_content = request.form["content"]

        new_comment = Comment(content=comment_content, page=page_name)


        try:

            db.session.add(new_comment)

            db.session.commit()

            return redirect(url_for('comments.comment_section', page_name=page_name))

        except:

            return "Error adding comment"

    else:

        comments = Comment.query.filter_by(page=page_name).order_by(Comment.id).all()

        return render_template("comment_section.html", comments=comments)

각 페이지의 템플릿에서 comment_section 코드를 추가할 때, URL에 page_name도 포함하십시오.

html

{% include "comment_section.html" %}

모든 페이지에 대해 페이지 이름을 사용하여 댓글 섹션을 표시하도록 yourapp/templates/index.html을 수정하십시오.

html

<h1>Page: {{ page_name }}</h1>

{% with %}

  {% set action_url = url_for('comments.comment_section', page_name=page_name) %}

  {% include "comment_section.html" %}

{% endwith %}

이제 댓글 섹션이 각 페이지별로 독립적으로 작동합니다. 댓글은 각 페이지에 해당하는 댓글만 가지게 되므로, 페이지에서 다른 페이지로 이동하면 서로 다른 댓글 섹션을 볼 수 있습니다. 페이지를 추가하거나 변경할 때 페이지 이름을 기반으로 댓글 섹션을 사용하십시오.