이번에는 회원가입 + 로그인 기능에 게시판 기능을 추가로 구현했다.

DB에서 테이블을 하나 더 만들어 만든 테이블에서 foreign key로 user id를 넣어서 스키마를 구성했다.

게시판에서는 내용과 작성자, 등록 시간을 볼 수 있다.

플라스크는 아마 이게 마지막일 것 같다.

 

소스코드

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from flask import Flask, session, render_template, redirect, request, url_for
from flaskext.mysql import MySQL
 
mysql = MySQL()
app = Flask(__name__)
 
# 데이터베이스 값 설정
app.config['MYSQL_DATABASE_USER'= 'root'
app.config['MYSQL_DATABASE_PASSWORD'= '0000'
app.config['MYSQL_DATABASE_DB'= 'boarddb'
app.config['MYSQL_DATABASE_HOST'= 'localhost'
app.secret_key = "ABCDEFG"
mysql.init_app(app)
 
@app.route('/', methods=['GET''POST']) # 메인 로그인 화면
def main():
    error = None
 
    if request.method == 'POST'# POST 형식으로 요청할 것임
        # 페이지에서 입력한 값을 받아와 변수에 저장
        id = request.form['id']
        pw = request.form['pw']
 
        conn = mysql.connect() # DB와 연결
        cursor = conn.cursor() # connection으로부터 cursor 생성
        sql = "SELECT id FROM users WHERE id = %s AND pw = %s" # 실행할 SQL문
        value = (id, pw)
        cursor.execute("set names utf8"# 한글이 정상적으로 출력이 되지 않는 경우를 위해
        cursor.execute(sql, value) # 메소드로 전달해 명령문을 실행
 
        data = cursor.fetchall() # SQL문을 실행한 결과 데이터를 꺼냄
        cursor.close()
        conn.close()
 
        if data:
            session['login_user'= id # 로그인 된 후 페이지로 데이터를 넘기기 위해 session을 사용함
            return redirect(url_for('home')) # home 페이지로 넘어감 (url_for 메소드를 사용해 home이라는 페이지로 넘어간다)
        else:
            error = 'invalid input data detected !' # 에러가 발생한 경우
 
    return render_template('main.html', error = error)
 
 
@app.route('/register', methods=['GET''POST']) # 회원가입 화면
def register():
    error = None
 
    if request.method == 'POST'# POST 형식으로 요청할 것임
        # 페이지에서 입력한 값을 받아와 변수에 저장
        id = request.form['regi_id']
        pw = request.form['regi_pw']
 
        conn = mysql.connect() # DB와 연결
        cursor = conn.cursor() # connection으로부터 cursor 생성
        sql = "INSERT INTO users VALUES ('%s', '%s')" % (id, pw) # 실행할 SQL문
        cursor.execute(sql) # 메소드로 전달해 명령문을 실행
        data = cursor.fetchall() # 실행한 결과 데이터를 꺼냄
 
        if not data:
            conn.commit() # 변경사항 저장
            return redirect(url_for('main'))  # 로그인 화면으로 이동
 
        else:
            conn.rollback() # 데이터베이스에 대한 모든 변경사항을 되돌림
            return "Register Failed"
 
        cursor.close()
        conn.close()
 
    return render_template('register.html', error=error) # 용도 확인
 
@app.route('/home', methods=['GET''POST']) # 로그인 된 후 홈 화면
def home():
    error = None
    id = session['login_user'# 세션에 저장했던 로그인 유저 아이디를 변수에 저장함
 
    if request.method == 'POST'# 게시판에 글 등록하기
        print("POST TEST")
        content = request.form['content']
        conn = mysql.connect()  # DB와 연결
        cursor = conn.cursor()  # connection으로부터 cursor 생성
        sql = "INSERT INTO content (id, content) VALUES ('%s', '%s')" % (id, content)  # 실행할 SQL문
        cursor.execute(sql)  # 메소드로 전달해 명령문을 실행
        new_data = cursor.fetchall()  # 실행한 결과 데이터를 꺼냄
 
        if not new_data:
            conn.commit()  # 변경사항 저장
            return redirect(url_for("home"))
 
        else:
            conn.rollback()  # 데이터베이스에 대한 모든 변경사항을 되돌림
            return "Register Failed"
 
        cursor.close()
        conn.close()
 
    elif request.method == 'GET'# 처음 페이지가 로드되는 GET 통신
        conn = mysql.connect()  # DB와 연결
        cursor = conn.cursor()  # connection으로부터 cursor 생성 (데이터베이스의 Fetch 관리)
        sql = "SELECT content, id, times FROM content ORDER BY times desc" # 실행할 SQL문
        cursor.execute(sql)  # 메소드로 전달해 명령문을 실행
        data = cursor.fetchall()  # 실행한 결과 데이터를 꺼냄
 
        data_list = []
 
        for obj in data: # 튜플 안의 데이터를 하나씩 조회해서
            data_dic = { # 딕셔너리 형태로
                # 요소들을 하나씩 넣음
                'con': obj[0],
                'writer': obj[1],
                'time':obj[2]
            }
            data_list.append(data_dic) # 완성된 딕셔너리를 list에 넣음
 
        cursor.close()
        conn.close()
 
        return render_template('home.html', error=error, name=id, data_list=data_list) # html을 렌더하며 DB에서 받아온 값들을 넘김
 
    return render_template('home.html', error=error, name=id)
 
if __name__ == '__main__':
    app.run()
 
cs

 

home.html

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
<!DOCTYPE html>
<html lang="en" xmlns:float="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
    <style>
        table {
            width: 100%;
            border-top: 1px solid #444444;
            border-collapse: collapse;
        }
        th, td {
            border-bottom: 1px solid #444444;
            padding: 10px;
            text-align: center;
        }
        th {
            background-color: #bbdefb;
        }
        td {
            background-color: #e3f2fd;
        }
</style>
</head>
 
<body>
    <p>
        <h1> Hello {{name}} ! </h1>
    </p>
 
    <form method="POST">
        <p><label>내용을 입력하세요 <input type="text" name="content"></label>&nbsp&nbsp&nbsp<input type="submit" value="작성하기" onclick="alert('작성 완료!')"></p>
    </form>
 
    <table class="table">
        <tr>
            <th>내용</th>
            <th>작성자</th>
            <th>작성시간</th>
        </tr>
        {% for obj in data_list%}
        <tbody>
            <tr>
                <td>{{obj.con}}</td>
                <td>{{obj.writer}}</td>
                <td>{{obj.time}}</td>
            </tr>
        </tbody>
        {% endfor %}
    </table>
</body>
 
</html>
cs

나머지 html 파일은 2편과 같음

 

결과

로그인 후 화면
게시글 업로드
결과

+ Recent posts