이고잉 강사님 깃허브 주소 : https://github.com/egoingsb/daegu-ai-school-web-src
글리치 주소 : https://glitch.com/edit/#!/flask---daegu-ai-school
복습
get과 post 방식
get은 url로 정보 전달해서 보안에 취약, 길이의 한계가 있음
SQLite 이즈스함에 넣기 위해서 만든 데이터베이스??
INSERT 삽입
DELETE 삭제
SELECT 선택
ls -l 파일 목록 상세보기
import sqlite3
#파이썬에 내장되어있기 때문에 pip 할 필요 없음
conn = sqlite3.connect('db.sqlite3')
curor = conn.cursor()
curor.execute('SELECT * FROM topics')
topics = curor.fetchall()
DB를 파이썬 화 하기
from flask import Flask, request, redirect
import sqlite3
app = Flask(__name__)
topics = [
{"id":1, "title":"html", "body":"html is ...."},
{"id":2, "title":"css", "body":"css is ...."},
{"id":3, "title":"js", "body":"js is ...."}
]
def template(content, id=None):
contextUI = ''
if id != None:
contextUI = '<input type="submit" value="delete" class="btn btn-dark">'
conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
cs.execute('SELECT * FROM topics')
topics = cs.fetchall()
conn.close()
liTags = ''
for topic in topics:
liTags = liTags + f'<li><a href="/read/{topic[0]}/">{topic[1]}</a></li>'
return f'''
<html>
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<style>
h1{{
border-bottom:10px solid green;
}}
h1>a{{
text-decoration:none;
}}
</style>
</head>
<body class="container">
<input type="button" value="night" onclick="
document.querySelector('body').style.backgroundColor = 'black';
document.querySelector('body').style.color = 'white';
">
<h1><a href="/">WEB</a></h1>
<ol>
{liTags}
</ol>
{content}
<form action="/delete/{id}/" method="POST">
<div class="btn-group" role="group" aria-label="Basic example">
<a href="/create/" class="btn btn-dark">create</a>
{contextUI}
</div>
</form>
</body>
</html>
'''
@app.route("/")
def index():
return template('<h2>Welcome</h2>Hello, WEB!')
@app.route("/read/<int:id>/")
def read(id):
conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
cs.execute('SELECT * FROM topics WHERE id=?', (id,))
topic = cs.fetchone()
conn.close()
title = topic[1]
body = topic[2]
return template(f'<h2>{title}</h2>{body}', id)
@app.route('/create/')
def create():
content = '''
<form action="/create_process/" method="POST">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea name="body" placeholder="body"></textarea></p>
<p><input type="submit" value="create"></p>
</form>
'''
return template(content)
@app.route('/create_process/', methods=['POST'])
def create_process():
title = request.form['title']
body = request.form['body']
conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
cs.execute('INSERT INTO topics (title, body) VALUES(?,?)',(title,body))
id = cs.lastrowid
conn.commit()
conn.close()
return redirect(f'/read/{id}/')
@app.route('/delete/<int:id>/', methods=['POST'])
def delete(id):
conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
cs.execute('DELETE FROM topics WHERE id = ?',(id,))
conn.commit()
conn.close()
return redirect('/')
# # @app.route('/update/')
# # def update():
# # return 'Update'
app.run()
결과물
데이터베이스를 조작할 땐 항상 경건한 마음으로 신중하게...
read 같은 건 서버 재부팅하면 되지만 업데이트, 삭제 같은 경우에는
돌이킬 수 없는 손실을 가져올 수도 있다고한다.
데이터베이스 비하 발언? DB 관리자들 까칠한게 대부분... ㅋㅋ
무조건 DELETE에는 WHERE가 들어간다 공식 처럼 생각하기.
글리치라는 색다른 환경이라 UI가 살짝 어색하기도 했고 파이썬 코드와 html 코드를 같이 쓰는데다가 UI가 투박해서 보기가 좀 불편했다.
2주간의 수업 동안 웹 서비스에 대한 전체적인 틀을 살펴본 것 같다.
html, css, js 기초와 파이썬과 flask와 sqlite3까지 풀스텍 순한맛을 본 것 같다. 결과적으로 어느 것 하나 깊게 배우지는 못했지만 결과적으로는 공부의 방향성이라던지 큰 틀을 생각할 수 있는 수업이었다.
프론트엔드이던 백엔드이던 DB이던 한 분야만 깊게 공부하겠다 하더라도 이 수업은 들어봐야 할 것 같다.