File size: 2,922 Bytes
e221c83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# src/ auth.py
# ๊ธฐ์กด app.py์—์„œ auth์™€ ๊ด€๋ จํ•ด์„œ ๋ถ„๋ฆฌ
# ๋กœ๊ทธ์ธ์ด๋‚˜ ํšŒ์›๊ฐ€์ž… ์ธ์ฆ ๊ด€๋ จํ•œ ์Šคํฌ๋ฆฝํŠธ

from flask import Blueprint, render_template, request, redirect, url_for, session, flash
import logging
from werkzeug.security import generate_password_hash, check_password_hash
from . import db
from .models import User

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

# ๋กœ๊ทธ์ธ ํŒŒํŠธ
@bp.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        logging.warning(f"--- ๋กœ๊ทธ์ธ ์‹œ๋„: ์‚ฌ์šฉ์ž๋ช… '{username}' ---")

        # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
        user = User.query.filter_by(username=username).first()

        if not user or not user.check_password(password):
            flash('๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.')
            # ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ™”๋ฉด(์•ž๋ฉด)
            return render_template('auth_combined.html')
        
        # ๋กœ๊ทธ์ธ ์„ฑ๊ณต
        session.clear()
        session['user_id'] = user.id
        session['username'] = user.username
        return redirect(url_for('main.home'))

    return render_template('auth_combined.html')

# ํšŒ์›๊ฐ€์ž… ํŒŒํŠธ
@bp.route('/signup', methods=['GET', 'POST'])
def signup():
    try:
        if request.method == 'POST':
            username = request.form['username']
            password = request.form['password']
            
            # 1. ์ค‘๋ณต ์‚ฌ์šฉ์ž ํ™•์ธ
            if User.query.filter_by(username=username).first():
                 flash('์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.')
                 # [ํ•ต์‹ฌ] ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์นด๋“œ๊ฐ€ ๋’ค์ง‘ํžŒ ์ƒํƒœ(ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด)๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด mode='signup'์„ ์ „๋‹ฌ
                 return redirect(url_for('auth.login', mode='signup'))

            # 2. ์ƒˆ ์‚ฌ์šฉ์ž ์ƒ์„ฑ
            new_user = User(username=username)
            new_user.set_password(password)
            
            db.session.add(new_user)
            db.session.commit()
            logging.warning("โœ… DB ์ €์žฅ ์„ฑ๊ณต: ์‚ฌ์šฉ์ž '{}'๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.".format(username))
            
            # 3. ๊ฐ€์ž… ์„ฑ๊ณต ์‹œ ๋กœ๊ทธ์ธ ํ™”๋ฉด(์•ž๋ฉด)์œผ๋กœ ์ด๋™
            flash('ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”.')
            return redirect(url_for('auth.login'))

    except Exception as e:
        db.session.rollback()
        logging.exception("๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ signup ํ•จ์ˆ˜์—์„œ DB ์˜ค๋ฅ˜ ๋ฐœ์ƒ! ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ")
        return "Internal Server Error", 500

    
    return render_template('auth_combined.html')

# ๋กœ๊ทธ์•„์›ƒ part
@bp.route('/logout')
def logout():

    # ์„ธ์…˜์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ œ๊ฑฐ
    session.clear()
    # ๋กœ๊ทธ์•„์›ƒ ํ›„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
    return redirect(url_for('auth.login'))