Programming/Python

Flask 웹사이트 구축 - 4. 데이터베이스 연결하기

juhpark 2022. 6. 25. 22:21
반응형

먼저 데이터베이스를 연결하기 위한  connect_db()함수를 만든다. 이 함수는 DATABASE 변수에 저장되어 있는 '/tmp/testnet.db' sqlite3 파일경로/이름을 사용하여 DB를 연결한다.

def connect_db():
    return sqlite3.connect(app.config['DATABASE'])

 

Flask에서는 request 요청 전후에, before_request, after_request, teardown_request 데코레이션을 사용할수 있다. before_request는 request요청전에 호출이 되고, after_request는 request요청 후에 호출이 된다. after_request는 예외사항 발생시 실행이 안될수 도 있기 때문에, teardown_request를 사용하며, 이 함수는 exception 객체를 변수로 받는다. g 객체는 Flask에서 사용되는 특별한 객체로, database작업을 위해 사용된다. application.py 파일에 위의 connect_db함수와 다음 두 함수를 입력한다.

# 모든 request 전에 DB컨넥션을 가져오고
@app.before_request
def before_request():
    g.db = connect_db()

# reqest가 끝난 이후에 DB컨넥션을 닫는다.
@app.teardown_request
def teardown_request(exception):
    g.db.close()

 

예를 들어 아래과 같이 request 가 호출되면, show_entries()함수가 실행되기 전 자동으로 위의 before_request()함수가 호출된 다음 show_entries() 함수가 실행되고 실행이 끝난 다음 teardown_request()함수가 실행이 되어 손쉽게 db 작업을 수행할 수 있게 된다. 아래 소스는 entries 테이블에서 데이터를 읽기만 하고, 웹브라우저 화면에는 ok 텍스트만 출력한다.

@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 "ok"

 

전체 소스 

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 "ok"
    

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=int(sys.argv[1]))
반응형