#2 Web 기능 구현

29390 단어 Face OutFace Out

1. 전체 구성



2. 로그인 기능 구현

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('/user_templates/login.html')
    else:
        u_id = request.form['u_id']
        u_pw = request.form['u_pw']
        data = db_session.query(User).filter_by(u_id=u_id, u_pw=u_pw).first()  # ID/PW 조회Query 실행
        if data is not None:  # 쿼리 데이터가 존재하면
            session['u_id'] = u_id
            session['logged_in'] = True
            return render_template('/user_templates/main.html', logged_in=True)  # 쿼리 데이터가 있으면 main으로
        else:
            flash('잘못 입력하셨습니다. 다시 로그인해주세요.')
            return redirect('/login')

3. 로그아웃 기능 구현

@app.route('/logout', methods=['GET','POST'])
def logout():
    session['logged_in'] = False
    session.clear()
    return render_template('/user_templates/main.html',logged_in=False)

4. 회원가입 기능 구현

@app.route('/signup', methods=['GET', 'POST'])
def sign_up():
    if request.method == 'GET':
        return render_template('/user_templates/signup.html')
    else:
        u_name = request.form.get('u_name', False)
        u_phone = request.form.get('u_phone', False)
        u_id = request.form.get('u_id', False)
        u_pw = request.form.get('u_pw', False)

        if not (u_name and u_phone and u_id and u_pw):
            # 하나라도 작성하지 않으면 다시 회원가입 화면
            return render_template('/user_templates/signup.html')
        elif db_session.query(User).filter_by(u_id=u_id).first() is not None:  # ID 조회해서 존재하는 아이디인지 확인
            flash('사용할 수 없는 아이디입니다.')
            return redirect('/signup')
        else:
            userinfo = User()
            userinfo.u_name = u_name
            userinfo.u_phone = u_phone
            userinfo.u_id = u_id
            userinfo.u_pw = u_pw
            db_session.add(userinfo)
            db_session.commit()

            session['u_id'] = u_id
            session['logged_in'] = True

            # 모두 작성하면 login 화면
            return render_template('/user_templates/main.html', logged_in=True)
        return redirect('/')

5. 마이페이지 기능 구현

@app.route('/mypage')
def my_page():
    if session.get('u_id'):
        info = db_session.query(User).filter_by(u_id=session['u_id']).first()
        return render_template('/user_templates/mypage.html', now_uname=info.u_name, now_uphone=info.u_phone, now_uid=info.u_id, now_upw=info.u_pw)
    else:
        return redirect('/login')

6. 마이페이지 정보 수정 기능 구현

@app.route('/myinfo_edit', methods=['GET','POST'])
def myinfo_edit():
    edit = db_session.query(User).filter_by(u_id=session['u_id']).first()
    if request.method == 'GET':
        return render_template('/user_templates/myinfo_edit.html', now_uname=edit.u_name, now_uphone=edit.u_phone, now_uid=edit.u_id, now_upw=edit.u_pw)
    else:
        if request.form['u_name'] != edit.u_name:
            edit.u_name = request.form['u_name']
        if request.form['u_phone'] != edit.u_phone:
            edit.u_phone = request.form['u_phone']
        if request.form['u_id'] != edit.u_id:
            edit.u_id = request.form['u_id']
        if request.form['u_pw'] != edit.u_pw:
            edit.u_pw = request.form['u_pw']
        db_session.add(edit)
        db_session.commit()
        session['u_id'] = edit.u_id # session에 다시 u_id 값 넣어줌, u_id 값이 변경될 수 있기 때문
        return redirect('/mypage')
    return render_template('/user_templates/main.html')

7. 게시판 글 작성 기능 구현

def q_write():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']
        create_date = datetime.now()
        category = request.form['category']

        newQ = QuestionContent()
        newQ.title = title 
        newQ.content = content
        newQ.create_date = create_date
        newQ.category = category

        try: # 비밀글 설정 checkbox가 체크되는지
            if request.form['is_secret']:
                newQ.is_secret = True
        except: newQ.is_secret = False # 체크 안 될 경우

        db_session.add(newQ)
        db_session.commit()

        return redirect('/q&a')
    else:
        return render_template('/user_templates/q_write.html')

8. 게시판 작성한 글 목록 구현

@app.route('/q&a')
def question_notice():
    question_list = db_session.query(QuestionContent)
    return render_template('/user_templates/q&a.html', question_list=question_list)

<동작 원리>
1. q&a 함수에서 받아 저장한 table 정보를 question_list로 받아옴
2. question_list를 q&a.html로 보내줌
3. q&a.html에서 question_list를 reverse한 채로 보여줌 (가장 최근 등록된 글이 가장 위로 올 수 있게)

9. 그 외 html 수정

1. 잘못 로그인된 경우, 메세지 창 띄워주기

{% with messages = get_flashed_messages() %}
{% if messages %}
<script>
alert("{{messages[-1]}}")
</script>
{% endif %}
{% endwith %}

👉 위 html code를 사용할 해당 html 가장 앞에 작성
👉 flash를 통해 띄울 메세지 창을 설정

2. Post 를 받아오지 못할 경우

<form method="post">
👉 request.method == 'POST'를 받아오지 못하는 경우가 있었음. 그럴 경우 해당 html에서 <form ~ > 부분에 method='post'를 작성해주면 됨

3. 로그인 되어있는지 확인

{% if session.logged_in %}
	<a class="nav-link" href="/logout" style="font-size:17px;">Logout</a></li>
{% else %}
	<a class="nav-link" href="/login" style="font-size:17px;">Login</a></li>
{% endif %}

👉 로그아웃을 하거나 그 외의 작업을 할때 session이 로그인 되어있는 상태인지 확인하기 위해 작업할 해당 html에서 위 코드를 사용해줌

좋은 웹페이지 즐겨찾기