본문 바로가기

웹개발

게시판(flask)-댓글, 추천

<댓글>

댓글을 저장하기 위한 테이블부터 만들어야 한다.

mysql> CREATE TABLE comments (
    ->   id INT AUTO_INCREMENT PRIMARY KEY,
    ->   post_id INT,
    ->   username VARCHAR(255),
    ->   content TEXT
    -> );

mysql에서 CREATE TABLE로 comments 테이블을 만들었다.

@app.route('/comment/<id>', methods=['POST'])
def comment(id):
    if 'username' not in session:
        return redirect(url_for('login'))
    
    username = session['username']
    content = request.form.get('content')

    conn = connectsql()
    cursor = conn.cursor()
    query = "INSERT INTO comments (post_id, username, content) VALUES (%s, %s, %s)"
    value = (id, username, content)
    cursor.execute(query, value)
    conn.commit()
    cursor.close()
    conn.close()
    
    return redirect(url_for('read', id=id))

comment 링크로 post 요청을 보내면 댓글을 작성할 수 있게 했다. 

로그인이 안 되어 있으면 로그인창으로 이동시킨다.

comments 테이블에 데이터를 넣고 보고 있던 글 페이지로 redirect했다.

<form method="post" action="{{ url_for('comment', id=post.id) }}">
    <textarea name="content" required></textarea>
    <button type="submit">댓글 달기</button>
</form>

read.html에 댓글 작성 폼을 추가하고 comment로 post 요청을 보내게 하였다.

 

query = "SELECT * FROM comments WHERE post_id = %s ORDER BY id DESC"
cursor.execute(query, id)
comments = cursor.fetchall()

라우터의 read 링크에서 comments 테이블에서 데이터를 가져와서 read.html로 comments를 보내준다.

<h2>댓글</h2>
{% for comment in comments %}
    <p>{{ comment.username }}: {{ comment.content }}</p>
{% endfor %}

read.html에서 comments를 받아서 댓글을 작성자: 내용 의 형식으로 보여준다.

 

 

<추천>

추천 데이터를 넣을 테이블 recommend를 먼저 만들어야 한다.

mysql> CREATE TABLE recommend (
    ->   id INT AUTO_INCREMENT PRIMARY KEY,
    ->   post_id INT,
    ->   username VARCHAR(255)
    -> );

어떤 게시글에 대한 추천인지 post_id와 누가 추천했는지 username을 속성으로 가진다.

@app.route('/recommend/<id>', methods=['POST'])
def recommend(id):
    if 'username' not in session:
        return redirect(url_for('login'))
    
    username = session['username']

    conn = connectsql()
    cursor = conn.cursor()
    
    query = "SELECT * FROM recommend WHERE post_id = %s AND username = %s"
    cursor.execute(query, (id, username))
    recommended = cursor.fetchone()
    
    if not recommended:
        query = "INSERT INTO recommend (post_id, username) VALUES (%s, %s)"
        cursor.execute(query, (id, username))
    
    conn.commit()
    cursor.close()
    conn.close()
    
    return redirect(url_for('read', id=id))

/recommend 링크에서는 우선 로그인이 안 되어 있으면 로그인 창으로 이동시키고 이미 추천이 되어 있는지

recommend 테이블에서 조회를 해본다. 추천이 되어있지 않다면 INSERT로 추천 데이터를 테이블에 넣고

read링크로 redirect한다.

query = "SELECT * FROM recommend WHERE post_id = %s AND username = %s"
cursor.execute(query, (id, username))
recommended = cursor.fetchone()

/read 링크에서도 추천했는지 여부를 recommended 변수에 담아서 read.html 파일로 보낸다.

{% if recommended %}
<p>추천한 글입니다.</p>
{% else %}
<form method="post" action="{{ url_for('recommend', id=post.id) }}">
    <button type="submit">추천</button>
</form>
{% endif %}

read.html에서는 추천하지 않았을 때만 추천 버튼을 보이게 한다.