이것저것

(7) 로그인 로그아웃 구현 본문

Python

(7) 로그인 로그아웃 구현

곰태태 2023. 11. 29. 15:49
반응형
SMALL

spring boot와 MySQL로 구현하게 되어서 급하게 마무리해본다...

먼저 templates/auth 폴더에 login.html 파일을 만든다

{% extends "base.html" %}
{% block content %}
<div class="container">
    <h5 class="my-3 border-bottom pb-2">로그인</h5>
    <form method="post">
        {{ form.csrf_token }}
        {% include "form_errors.html" %}
        <div class="mb-3">
            <label for="email">사용자 이메일</label>
            <input type="text" class="form-control" name="email" id="email"
                   value="{{ form.email.data or '' }}">
        </div>
        <div class="mb-3">
            <label for="password">비밀번호</label>
            <input type="password" class="form-control" name="password" id="password"
                   value="{{ form.password.data or '' }}">
        </div>
        <button type="submit" class="btn btn-primary">로그인</button>
    </form>
</div>
{% endblock %}

 

auth_views.py에 로그인 폼과 로그인 여부, 로그아웃 라우팅을 추가한다.

from flask import Blueprint, url_for, render_template, flash, request, session, g
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.utils import redirect

from server.pybo import db
from server.pybo.forms import UserCreateForm, UserLoginForm
from server.pybo.models import Users

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

# 회원가입 폼 입력받기
@bp.route('/signup', methods=('GET', 'POST'))
def signup():
    form = UserCreateForm()
    if request.method == 'POST' and form.validate_on_submit():
        user_by_email = Users.query.filter_by(email=form.email.data).first()
        user_by_nickname = Users.query.filter_by(nickname=form.nickname.data).first()
        if user_by_email:
            flash('이미 사용 중인 이메일입니다.')
        elif user_by_nickname:
            flash('이미 사용 중인 닉네임입니다.')
        else:
            users = Users(
                nickname=form.nickname.data,
                users_name=form.users_name.data,
                password=generate_password_hash(form.password1.data),
                email=form.email.data,
                users_birth=form.users_birth.data,
                users_phone=form.users_phone.data,
                address_main=form.address_main.data,
                address_sub=form.address_sub.data
                )
            db.session.add(users)
            db.session.commit()
            return redirect(url_for('main.index'))
    return render_template('auth/signup.html', form=form)

# 로그인 폼
@bp.route('/login', methods=('GET', 'POST'))
def login():
    form = UserLoginForm()
    if request.method == 'POST' and form.validate_on_submit():
        error = None
        user = Users.query.filter_by(email=form.email.data).first()
        if not user:
            error = "존재하지 않는 이메일입니다."
        elif not check_password_hash(user.password, form.password.data):
            error = "비밀번호가 올바르지 않습니다."
        if error is None:
            session.clear()
            session['users_id'] = user.users_id
            return redirect(url_for('main.index'))
        flash(error)
    return render_template('auth/login.html', form=form)

# 로그인 여부 확인
@bp.before_app_request
def load_logged_in_user():
    users_id = session.get('users_id')
    if users_id is None:
        g.user = None
    else:
        g.user = Users.query.get(users_id)

# 로그아웃 라우팅
@bp.route('/logout')
def logout():
    session.clear()
    return redirect(url_for('main.index'))

 

pybo에 forms.py에 로그인폼을 추가해준다.

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, EmailField
from wtforms.validators import DataRequired, Length, EqualTo, Email

# 회원가입 폼
class UserCreateForm(FlaskForm):
    nickname = StringField(
        '아이디',
        validators=[DataRequired(), Length(min=3, max=25)]
    )
    users_name = StringField(
        '사용자 이름',
        validators=[DataRequired(), Length(min=3, max=25)]
    )
    password1 = PasswordField(
        '비밀번호',
        validators=[
            DataRequired(), EqualTo('password2', '비밀번호가 일치하지 않습니다.')]
    )
    password2 = PasswordField(
        '비밀번호확인',
        validators=[DataRequired()]
    )
    email = EmailField(
        '이메일',
        validators=[DataRequired(), Email()]
    )
    users_birth = StringField(
        '생년월일',
        validators=[DataRequired(), Length(min=8, max=8, message='생년월일은 8자리여야 합니다. ex)19961020')]
    )
    users_phone = StringField(
        '전화번호',
        validators=[DataRequired(), Length(min=10, max=15)]  # 전화번호 형식에 맞춰 길이를 조정하세요.
    )
    address_main = StringField(
        '주소',
        validators=[DataRequired()]
    )
    address_sub = StringField(
        '상세주소',
        validators=[DataRequired()]
    )

# 로그인폼
class UserLoginForm(FlaskForm):
    email = StringField('사용자 이메일', validators=[DataRequired(), Email()])
    password = PasswordField('비밀번호', validators=[DataRequired()])

 

이제 run_dms로 실행후 확인해보면 로그인 전과 로그인 후에 navbar가 다른것을 확인할 수 있다...

여기까지 한건 git에 올려놨는데

차마 남한테 보여주기 민망해서 올리지는 못하겠다

1~7번까지 폴더만 잘 복붙해도 돌아갈꺼같다

 

 

혹시 빠진 부분이 있으면 알려주시면 수정하겠습니다

아니면 깃코드가 필요하신분은 댓글 남겨주시면 링크를 보내드리겠습니다

반응형
LIST
Comments