이 글에서는 flask를 통해 댓글 기능을 구현하는 방법에 대해서 설명합니다.
댓글 기능 만들기
블루프린트를 사용하여 댓글 기능을 구현하려면 다음 단계에 따라서 작성합니다.
모듈 구조 생성 후, 라이브러리 설치:
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
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로 유지하는 것이 좋습니다.
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)
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')
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)
댓글 영역을 나타내는 템플릿 파일 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>
기존 index.html에 댓글 섹션 삽입을 위해 다음 코드를 추가합니다.
html
{% block comments %}
{% include "comment_section.html" %}
{% endblock %}
최초 실행 전에 데이터베이스 초기화합니다. 실행 전에 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 %}
이제 댓글 섹션이 각 페이지별로 독립적으로 작동합니다. 댓글은 각 페이지에 해당하는 댓글만 가지게 되므로, 페이지에서 다른 페이지로 이동하면 서로 다른 댓글 섹션을 볼 수 있습니다. 페이지를 추가하거나 변경할 때 페이지 이름을 기반으로 댓글 섹션을 사용하십시오.