Python Flask 개념 정리 1
Flask 애플리케이션과 데이터베이스 연결 관리
Flask instance의 db_pool 필드
Flask 애플리케이션 객체에 커스텀 속성을 추가하여 데이터베이스 연결 풀을 관리할 수 있습니다.
app = Flask(__name__)
app.db_pool = psycopg2.pool.SimpleConnectionPool(
1, 10, # min_conn, max_conn
dsn=app.config['DATABASE_URL']
)이렇게 하면 애플리케이션 전체에서 하나의 연결 풀을 공유하여 효율적인 데이터베이스 연결 관리가 가능합니다.
psycopg2의 역할
psycopg2는 Python에서 PostgreSQL 데이터베이스에 연결하기 위한 어댑터입니다.
주요 기능:
- PostgreSQL 데이터베이스 연결
- SQL 쿼리 실행
- 트랜잭션 관리 (commit, rollback)
- 연결 풀링 지원
- 데이터 타입 변환
import psycopg2
conn = psycopg2.connect("postgresql://user:password@host:port/dbname")
cur = conn.cursor()
cur.execute("SELECT * FROM table_name")DB 풀(Connection Pool)이란?
데이터베이스 연결 풀은 미리 생성된 데이터베이스 연결들을 관리하는 메커니즘입니다.
장점:
- 연결 생성/해제 오버헤드 감소
- 동시 연결 수 제한으로 리소스 관리
- 애플리케이션 성능 향상
예시:
# 풀에서 연결 가져오기
conn = app.db_pool.getconn()
# 사용 후 풀에 반환
app.db_pool.putconn(conn)Flask의 g 객체
g는 Flask의 애플리케이션 컨텍스트 로컬 객체로, 요청 동안 데이터를 저장하는 데 사용됩니다.
특징:
- 각 요청마다 독립적인 저장 공간
- 요청이 끝나면 자동으로 정리됨
- 스레드 안전성 보장
def get_db():
if 'db_conn' not in g:
g.db_conn = psycopg2.connect(DATABASE_URL)
return g.db_conn
@app.teardown_appcontext
def close_db(exception=None):
db_conn = g.pop('db_conn', None)
if db_conn is not None:
db_conn.close()Flask의 request 객체와 접근 방법
Flask의 request 객체는 현재 HTTP 요청에 대한 정보를 담고 있습니다.
request.get_json()
JSON 데이터를 파싱하여 Python 딕셔너리로 반환합니다.
@app.route('/api', methods=['POST'])
def handle_json():
data = request.get_json()
name = data.get('name') # 안전한 접근
return jsonify({"received": name})request.json
request.get_json()의 프로퍼티 버전으로, 동일한 기능을 수행합니다.
data = request.json
# request.get_json()과 동일request.args.get()
URL 쿼리 파라미터에 접근할 때 사용합니다.
# URL: /search?q=python&page=1
@app.route('/search')
def search():
query = request.args.get('q') # 'python'
page = request.args.get('page', 1) # 기본값 1
return f"검색어: {query}, 페이지: {page}"Python에서 with 구문
with 구문은 컨텍스트 매니저를 사용하여 리소스를 안전하게 관리하는 구문입니다.
특징:
- 자동으로 리소스 정리
- 예외 발생 시에도 안전한 정리 보장
__enter__와__exit__메서드 활용
# 파일 처리 예시
with open('file.txt', 'r') as f:
content = f.read()
# 파일이 자동으로 닫힘
# 데이터베이스 연결 예시
with psycopg2.connect(DATABASE_URL) as conn:
with conn.cursor() as cur:
cur.execute("SELECT * FROM users")
result = cur.fetchall()
# 연결과 커서가 자동으로 정리됨if not all([a,b,c]) 구문
all() 함수는 모든 요소가 True인지 확인하는 내장 함수입니다.
동작 방식:
- 모든 요소가 참이면
True반환 - 하나라도 거짓이면
False반환 - 빈 이터러블은
True반환
# 모든 필수 데이터가 있는지 확인
from_account = data.get('from_account')
to_account = data.get('to_account')
amount = data.get('amount')
if not all([from_account, to_account, amount]):
return jsonify({"error": "Missing data"}), 400
# 다음과 동일함:
# if not from_account or not to_account or not amount:
# return jsonify({"error": "Missing data"}), 400예시 결과:
all([1, 2, 3]) # True
all([1, 0, 3]) # False (0은 falsy)
all([]) # True (빈 리스트)
all(['a', 'b', '']) # False (빈 문자열은 falsy)