TIL/Python

[Python] Flask SQLite 권한 별 게시글 수정

hyo-min 2024. 4. 4. 20:44

'posts' 테이블에 Foreign key로 username을 주고 'users' 테이블의 'username' 열에 연결한다.

 

FOREIGN KEY(username) REFERENCES users(username)

'posts' 테이블의 'username' 열이 'users' 테이블의 'username' 열을 참조한다는 것을 의미한다.

따라서 'username' 열의 값은 'users' 테이블에 존재하는 값만 가질 수 있게 된다.

#models.py

import sqlite3

DATABASE = 'database.db'

def create_table_posts():
    conn = sqlite3.connect(DATABASE)
    cur = conn.cursor()
    cur.execute('''
        CREATE TABLE IF NOT EXISTS posts (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL,
            title TEXT NOT NULL,
            content TEXT NOT NULL,
            date TEXT NOT NULL,
            nickname TEXT,
            FOREIGN KEY(username) REFERENCES users(username)
        )
    ''')
    conn.commit()
    conn.close()
    
    
    def create_table_users():
    conn = sqlite3.connect(DATABASE)
    cur = conn.cursor()
    cur.execute('''
        CREATE TABLE IF NOT EXISTS users (
            username TEXT PRIMARY KEY,
            password TEXT NOT NULL,
            nickname TEXT
        )
    ''')
    cur.execute("SELECT COUNT(*) FROM users")
    count = cur.fetchone()[0]
    if count == 0:
        cur.execute("INSERT INTO users (username, password, nickname) VALUES (?, ?, ?)", ('admin', 'admin', 'admin_test'))
    conn.commit()
    conn.close()

 

 

 

"SELECT P.username FROM posts P INNER JOIN users U ON P.username=U.username WHERE P.id = ?", (post_id,))
'posts' 테이블과 'users' 테이블을 조인하여 'username'을 검색하는 쿼리

'posts' 테이블의 id 값이 HTML에서 받아온 post_id 값인 경우 검색해온다.

#app.py

@app.route('/edit/<int:post_id>', methods=['GET', 'POST'])
def edit(post_id):
    conn = sqlite3.connect(DATABASE)
    cur = conn.cursor()
    
        #로그인을 한 경우
        if session["logged_in"]:
        
            #로그인 정보
            username = session["username"]
            
            #게시글 정보
            cur.execute(
            "SELECT P.username FROM posts P INNER JOIN users U ON P.username=U.username WHERE P.id = ?", (post_id,))
            result = cur.fetchall()
            
            #username이 일치하거나 admin이라면 
            if result[0][0]==username or "admin" == session["username"]:
                cur.execute("SELECT * FROM posts WHERE id = ?", (post_id,))
                post = cur.fetchone()
                conn.close()
                return render_template('edit.html', post=post)
                
            else :
                return f'''
                <script> alert("수정 권한이 없습니다.");
                location.href="/post/{post_id}"
                </script>
                '''