반응형

0. 들어가기

-. Flask로 게시판 기능을 만든다.

-. 외형은 부트스트랩을 이용해 꾸밈.

1. 게시판 기능 구현

1) 우선 파이썬 스크립트를 이용해 SQLite에 더미 글들을 넣는다.

from flask import Flask
from WebStockServer.DBmodels import ArticleRepository
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
import config

db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(config)
app.app_context().push()
db.init_app(app)


for i in range(300):
    article = ArticleRepository(articleSubject="Dummy subject: [%03d]" % i, articleContent="Dummy Content: [%03d]" % i, articleCreateTime=datetime.now(), userid=i)
    db.session.add(article)
db.session.commit()

-. 위 코드를 실행하면 아래와 같은 데이터가 생김

2) DB에 있는 article 데이터들을 웹에서 불러오자.

-. 앞에서 blueprint를 이용해 만든 board_views를 아래와 같이 수정한다.

from flask import Blueprint, render_template, redirect, url_for
from WebStockServer import db
from WebStockServer.DBmodels import ArticleRepository

bp = Blueprint('board', __name__, url_prefix='/board')


@bp.route('/')
def board_main():
    article_list = ArticleRepository.query.order_by(ArticleRepository.articleID.desc())
    print(article_list)
    return render_template('board/board_list.html', article_list=article_list)

-. templates/board/bord_list.html 파일을 생성해서 아래 스크립트를 작성한다.

{% if article_list %}
    <ul>
    {% for article in article_list %}
        <li><a href="/board/article/{{ article.articleID }}/">{{ article.articleSubject }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>게시글이 없습니다.</p>
{% endif %}

-. 이제 /board url에 접속하면 게시글들이 쭉 나열된 것을 볼 수 있다. 아직 링크 자체는 활성화 되어있지 않다.

3) 각각의 게시글 내용을 보여주는 route 생성

-. 위 그림에서 생성된 링크를 클릭하면 404 Not Found 에러가 뜬다. 링크만 생성하고 아직 해당 url에 대한 라우트 작업을 하지 않았기 때문.

-. board_views.py를 수정하고 /barod/article.html 파일을 생성해 아래와 같이 작성한다.

#booard_views.py 추가내용

@bp.route('/article/<int:articleID>/')
def board_content(articleID):
    article = ArticleRepository.query.get_or_404(articleID)
    return render_template('board/article.html', article=article)
    
    
#/board/article.html 작성
<h1>{{ article.articleSubject }}</h1>

<div>
    {{ article.articleContent }}
</div>

-. 이제 글 리스트 링크를 누르면 해당 글이 뜬다.

3. 댓글달기 기능 추가

1) 댓글달기 기능을 추가한다. 우선 댓글 입력 시 DB 저장먼저 구현

#board_views.py 수정

from flask import Blueprint, render_template, redirect, url_for, request
from WebStockServer import db
from WebStockServer.DBmodels import ArticleRepository, CommentRepository
from datetime import datetime

bp = Blueprint('board', __name__, url_prefix='/board')


@bp.route('/')
def board_main():
    article_list = ArticleRepository.query.order_by(ArticleRepository.articleID.desc())
    print(article_list)
    return render_template('board/board_list.html', article_list=article_list)


@bp.route('/article/<int:articleID>/')
def board_content(articleID):
    article = ArticleRepository.query.get_or_404(articleID)
    return render_template('board/article.html', article=article)


@bp.route('/create/<int:article_id>', methods=('POST',))
def create(article_id):
    article = ArticleRepository.query.get_or_404(article_id)
    content = request.form['commentContent']
    userid = request.form['userid']
    comment = CommentRepository(commentContent=content, userid=userid, commentCreateTime=datetime.now())
    article.comment_set.append(comment)
    db.session.commit()
    return redirect(url_for('board.board_content', articleID=article_id))


#article.html 수정
<h1>{{ article.articleSubject }}</h1>

<div>
    {{ article.articleContent }}
</div>

<form action="{{ url_for('board.create', article_id = article.articleID) }}" method="post">
    <textarea name="commentContent" id="commentContent" rows="15"></textarea>
    <textarea name="userid" id="userid" rows="1"></textarea>
    <input type="submit" value="댓글달기">
</form>

-. 새로이 뜬 페이지에 댓글달기 버튼을 누르면 DB에 저장되는 것을 확인할 수 있다.

<댓글입력 기능과 DB 저장 확인>

2) html 파일을 수정해서 댓글 보여주는 항목을 추가한다.

<h1>{{ article.articleSubject }}</h1>

<div>
    {{ article.articleContent }}
</div>

<h5>{{ article.comment_set|length }}개의 댓글이 있습니다.</h5>
<div>
    <ol>
    {% for comment in article.comment_set %}
        <li>{{ comment.commentContent }} / 작성자: {{ comment.userid }} </li>
    {% endfor %}
    </ol>
</div>

<form action="{{ url_for('board.create', article_id = article.articleID) }}" method="post">
    <textarea name="commentContent" id="commentContent" rows="15"></textarea>
    <textarea name="userid" id="userid" rows="1"></textarea>
    <input type="submit" value="댓글달기">
</form>

-. 출력

<댓글기능 구현 완료>

부트스트랩은 다음 포스팅에서.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기