uv#
uv는 Python 프로젝트와 패키지를 관리할 수 있는 도구에요.
요즘 이거 안쓰면 안돼요.
pip처럼 패키지를 설치할 수 있지만 Rust로 만들어져 빠르고, 프로젝트마다 가상환경과 패키지 버전을 관리하기 편하다는 특징이 있어요.
프로젝트를 만들고 Flask를 설치하려면 다음과 같이 사용할 수 있어요.
uv init
uv add flaskbashFlask란?#
Flask는 Python으로 만들어진 웹 프레임워크에요.
문법이 간단하고 가벼워서 간단한 웹 서버나 백엔드를 만들 때 사용해요.
Flask Routing#
Flask에서는 @app.route()를 사용해서 특정 URL에 들어왔을 때 어떤 함수를 실행할지 정할 수 있어요.
@app.route("/login", methods=["GET", "POST"])
def login():
...python위 코드는 /login에 GET이나 POST 요청이 들어오면 login() 함수를 실행한다는 의미에요.
request#
request는 클라이언트가 서버로 보낸 요청의 정보를 확인할 때 사용해요.
한마디로 사용자가 어떻게 요청했고 뭘 보냈는지 지켜보고 있는 감시자같은 거로 생각하면 쉬워요.
URL Parameter는 다음과 같이 가져올 수 있어요.
name = request.args.get("name", "pca")pythonHTML의 form에서 전송된 값은 다음과 같이 가져올 수 있습니다.
username = request.form["username"]python예를 들어 HTML에 다음과 같은 입력창이 있다면,
<input name="username">html서버에서 request.form["username"]으로 값을 가져올 수 있어요.
render_template#
Flask에서 HTML 파일을 반환할 때는 render_template()을 사용할 수 있어요.
return render_template("index.html")python이렇게 작성하면 프로젝트의 templates/index.html을 불러와 사용자에게 보여줘요.
Jinja Template#
Jinja Template은 HTML 안에서 Flask가 전달한 변수나 조건문, 반복문 등을 사용할 수 있게 해주는 템플릿 엔진이에요.
변수는 다음처럼 사용할 수 있어요.
<h1>{{ username }}</h1>html조건문이나 반복문 같은 로직은 {% %}를 사용해요.
{% if username %}
<p>Hello {{ username }}</p>
{% endif %}html덕분에 매번 HTML을 문자열로 이어붙이는 끔찍한 짓을 하지 않아도 돼요.
Session#
Session은 이전 시간에도 배웠듯이 사용자의 상태를 유지하기 위해 사용하는 값이에요.
Flask에서는 다음과 같이 값을 Session에 저장할 수 있어요.
session["username"] = "mizuki"python문자열뿐만 아니라 Dictionary 같은 값도 넣을 수 있어요.
로그인에 성공한 사용자를 기억하는 등의 용도로 사용할 수 있습니다.
Database란?#
서버 코드에서 변수에 데이터를 저장하면 서버가 종료됐을 때 데이터가 사라질 수 있어요.
그래서 데이터를 지속적으로 저장하기 위해 Database를 사용합니다.
회원 정보나 게시글처럼 서버를 재시작해도 남아 있어야 하는 정보들을 저장하는 곳이라고 생각하면 됩니다.
SQLite3#
SQLite3는 별도의 데이터베이스 서버를 실행할 필요 없이 하나의 파일에 데이터를 저장하는 가벼운 데이터베이스입니다.
간단한 프로젝트에서 사용하기 편해서 Flask와 같이 사용하기 좋습니다.
행과 열#
Database의 Table은 크게 **행(Row)**과 **열(Column)**로 이루어져 있어요.
예를 들어 회원 정보를 저장한다고 하면,
| id | name | age |
|---|---|---|
| 1 | mizuki | 18 |
| 2 | miku | 16 |
id, name, age가 열이고, 각각의 사용자 정보 하나가 행이라고 생각하면 됩니다.
자료형과 제약조건#
SQLite3에서 대표적으로 사용하는 자료형은 다음과 같아요.
| 자료형 | 설명 |
|---|---|
TEXT | 문자열 |
INTEGER | 정수 |
BLOB | 이미지 등의 바이너리 데이터 |
대표적인 제약조건도 있습니다.
| 제약조건 | 설명 |
|---|---|
PRIMARY KEY | 각 데이터를 구분하는 기본 키 |
NOT NULL | 빈 값 금지 |
UNIQUE | 중복 값 금지 |
AUTOINCREMENT | 값 자동 증가 |
예를 들어 회원 번호를 만들 때 PRIMARY KEY AUTOINCREMENT를 사용하면 대기표처럼 번호가 자동으로 증가하게 만들 수 있어요.
SQL 기본 문법#
CREATE#
Table을 만들 때 사용해요.
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
age INTEGER
);sqlSELECT#
데이터를 조회할 때 사용해요.
SELECT * FROM users;sql특정 조건의 데이터만 가져오려면 WHERE를 사용해요.
SELECT * FROM users WHERE username = 'mizuki';sqlINSERT#
데이터를 추가할 때 사용해요.
INSERT INTO users (username, age)
VALUES ('mizuki', 18);sqlUPDATE#
기존 데이터를 변경할 때 사용해요.
UPDATE users
SET age = 19
WHERE username = 'mizuki';sqlDELETE#
데이터를 삭제할 때 사용해요.
DELETE FROM users
WHERE username = 'mizuki';sql이렇게 데이터를 생성(Create), 조회(Read), 수정(Update), 삭제(Delete) 하는 것을 묶어서 CRUD라고 해요.
Python에서 SQLite3 사용하기#
Python에서는 기본적으로 sqlite3 모듈을 사용할 수 있어요.
import sqlite3
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
)
""")
conn.commit()
conn.close()python대충 순서는
DB 연결
↓
Cursor 생성
↓
SQL 실행
↓
변경사항 저장
↓
연결 종료text라고 생각하면 돼요.
실행 결과 가져오기#
SELECT를 실행했다면 결과를 Python으로 가져와야해요.
여러 행을 모두 가져올 때는 fetchall()을 사용해요.
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
print(rows)python예를 들어 다음처럼 여러 결과가 반환될 수 있어요.
[(1, "bob", 18), (2, "alice", 14)]python하나의 행만 가져오려면 fetchone()을 사용해요.
cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
print(row)python결과는 다음과 같은 형태가 돼요.
(1, "bob", 18)python-----BEGIN SSH SIGNATURE-----
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg4c/dn4BitGH1/xNjKoKEp97I2b
eU57QXvkDBEdNNrEMAAAATYmxvZy5pbW55YS5uZy9wb3N0cwAAAAAAAAAGc2hhNTEyAAAA
UwAAAAtzc2gtZWQyNTUxOQAAAEAwZeIzO4MJroc3pdQvRjt9kclYesVC87s/+FDmauiWv8
53aMj84/QxEnr+Mh6HMPFQF1eBEnt0WveWfxldPt0P
-----END SSH SIGNATURE-----