창작물

나만의 실습 페이지 만들기 (3.5편)

ilsancityboy 2024. 6. 21. 12:14

https://ilsancityboy.tistory.com/75

 

나만의 실습 사이트 만들기 (3편)

https://ilsancityboy.tistory.com/74 나만의 실습 사이트 만들기 (2.5편)https://ilsancityboy.tistory.com/73#comment21545088 나만의 실습 사이트 만들기 (2편)지난글https://ilsancityboy.tistory.com/72 나만의 실습 사이트 만

ilsancityboy.tistory.com

지난 글에서는 게시판 기능과 글쓰기에 관련된 기능들을 구현했다.

이번 글에서는 쿠키 세션을 활용해 게시판 글쓰기 기능의 작성자 부분을 회원정보의 아이디로 고정시켜 글 작성이 되게끔 만들어 볼 것이다.


1. import  . . . session

먼저 기존코드에서 import 부분에 flask 모듈에서 session을 가져오게끔 추가했다.

from flask import Flask, render_template, request, redirect, url_for , flash , session

 

 

2. login 라우팅 설정 수정

그리고 기존 app.py 에서 로그인 라우팅 부분을 수정해주었다.

@app.route('login', methods=['GET','POST'])
def login():
    if 'username' in session:
        return redirect(url_for('board'))
        
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()


        if user and check_password_hash(user.password, password):
            session['username'] = user.username
            return redirect(url_for('board'))
        else:
            return render_template('login.html', error=True)
    return render_template('login.html')

 

 

    if 'username' in session:
        return redirect(url_for('board'))

 

  • 로그인 페이지에 접근할 때 이미 세션에 username이 있으면 사용자가 로그인된 상태다.
  • 이 경우 게시판 페이지로 리디렉션한다.

 

    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()


        if user and check_password_hash(user.password, password):
            session['username'] = user.username
            return redirect(url_for('board'))
        else:
            return render_template('login.html', error=True)
    return render_template('login.html')

 

 

  • 로그인 폼을 제출하면 사용자 이름과 비밀번호를 확인하고, 성공 시 세션에 username을 저장한다.
  • 로그인이 성공하면 게시판 페이지로 리디렉션한다.
  • 실패하면 로그인 페이지에 에러 메시지를 표시한다.
    (여기선 login.html에 에러 메시지 표기시 로그인 정보가 일치하지 않습니다 라고 설정해 둔 상태)

 

 

 

3. Create 라우팅 설정 수정

@app.route('/create', methods=['GET', 'POST'])
def create():
    if request.method == 'POST':
        title = request.form['title']
        author = session.get('username', 'guest')
        content = request.form['content']
        new_post = Post(title=title, author=author, content=content)
        try:
            db.session.add(new_post)
            db.session.commit()
            return redirect(url_for('board'))
        except:
            flash('게시글 작성 중 오류가 발생했습니다.', 'danger')
            return redirect(url_for('create'))
    return render_template('create.html')

 

기존 코드에서 수정된 부분은

author = session.get('username', 'guest') 

이다. 

session에서 username을 가져오고 이를 author로 설정하게 된다.

 

4. Create html 수정

            <form action="{{ url_for('create') }}" method="post">
                <label for="title">제목:</label>
                <input type="text" id="title" name="title" required>
                              
                <label for="content">내용:</label>
                <textarea id="content" name="content" rows="10" required></textarea>
                
                <button class="custom_button">게시글 작성</button>
            </form>

기존 코드에서 이부분에 있던 작성자 필드를 받아주는 코드만 지워주었다.


결과물