Programming/Python

Flask 웹사이트 구축 - 5. 웹페이지(html) 렌더링을 하는 뷰 함수들

juhpark 2022. 6. 27. 23:50
반응형

show_entries() : 작성된 글을 보여주는 함수

홈페이지의 root (/)를 호출하면, db의 entries를 id 기준, 역순으로 select 하여 entries 변수에 담고, render_template 함수를 사용하여, entries 변수 값과 show_entries.html  파일과 바인딩하여, 최종 html을 return 한다. 

@app.route('/')
def show_entries():
    cur = g.db.execute('select title, text from entries order by id desc')
    entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
    return render_template('show_entries.html', entries=entries)

 

add_entry() : 새로운 글 추가하기 

/add url을 파라메터와 함께 호출하면 entries에 데이터를 입력하고, commit() 함수를 실행한다. flash함수는 웹페이지상에서 get_flashed_message()함수를 사용하여 텍스트를 보여줄 수 있다.

@app.route('/add', methods=['POST'])
def add_entry():
    if not session.get('logged_in'):
        abort(401)
    g.db.execute('insert into entries (title, text) values (?, ?)',
                 [request.form['title'], request.form['text']])
    g.db.commit()
    flash('New entry was successfully posted')
    return redirect(url_for('show_entries'))

 

로그인과 로그 아웃

로그인 아이디와 패스워드는 그냥 환경변수에 하드코딩된 USERNAME과 PASSWORD를 그냥 사용하여 로그인 체크하게 한다. 추후, DB에 저장된 사용자 테이블을 활용하여, 로그인 처리도 가능하게 할 것이다. /login URL을 호출할때, GET방식으로 호출되면, login.html 파일을 렌더링하여 화면을 보여주고, 혹은 로그인에 실패할 경우에는 에러메시지와 함께 다시 로그인 페이지로 이동한다. 로그인 성공한 경우, 세션에 로그인 상태값을 입력하고, show_entries URL을 호출하고, flash메시지도 함께 보여준다.

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = 'Invalid username'
        elif request.form['password'] != app.config['PASSWORD']:
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            flash('You were logged in')
            return redirect(url_for('show_entries'))
    return render_template('login.html', error=error)

 

로그아웃시에는 세션의 logged_in 변수를 삭제하고, flash메시지와 함께 show_entries URL로 이동한다.

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('show_entries'))

 

전체소스

import sqlite3, sys
from flask import Flask, request, session, g, redirect, url_for, \
     abort, render_template, flash

# configuration
DATABASE = '/tmp/testnet.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'
    
app = Flask(__name__)
app.config.from_object(__name__)

@app.before_request
def before_request():
    g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
    g.db.close()    
    
def connect_db():
    return sqlite3.connect(app.config['DATABASE'])  
          
@app.route('/')
def show_entries():
    cur = g.db.execute('select title, text from entries order by id desc')
    entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
    return render_template('show_entries.html', entries=entries)

@app.route('/add', methods=['POST'])
def add_entry():
    if not session.get('logged_in'):
        abort(401)
    g.db.execute('insert into entries (title, text) values (?, ?)',
                 [request.form['title'], request.form['text']])
    g.db.commit()
    flash('New entry was successfully posted')
    return redirect(url_for('show_entries'))

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = 'Invalid username'
        elif request.form['password'] != app.config['PASSWORD']:
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            flash('You were logged in')
            return redirect(url_for('show_entries'))
    return render_template('login.html', error=error)

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('show_entries'))
    
    
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=int(sys.argv[1]))

 

 

반응형