flask 데이터베이스 연동

y's·2022년 4월 1일
0

개발일지

목록 보기
8/36

3/31

학습한 내용

파이썬을 이용한 sqlite3 활용


cmd로 DB 생성 및 정리 (파이썬으로 sqlite3 핸들링. DB(생성한 파일)를 읽고 쓰기)

.open db.sqlite3 (db라는 파일이 없다면 생성됨.)

id integer primary key,
title text not null,
body text
);

ls -l (파일들 상세보기)

python3 sqlite3 ★검색창에 검색. (인터페이스 검색)

read.py

import sqlite3
conn = sqlite3.connect('db.sqlite3')
curor = conn.cursor()
curor.execute('SELECT * FROM topics')
topics = curor.fetchall()
for topic in topics:
  print(topic[0], topic[1])
conn.close()

$ python3 read.py
$ sqlite3 db.sqlite3

create.py

import sqlite3
conn = sqlite3.connect('db.sqlite3')
curor = conn.cursor()
title = input('title? ')
body = input('body? ')
curor.execute('INSERT INTO topics (title, body) VALUES(?, ?)', (title, body))
conn.commit()
conn.close()
import read

$ python3 create.py
title? 입력
body? 입력
$ python3 read.py


topics 들을 DB로 바꾸기 (영구보관 가능)

전 > 후

전 > 후

삭제버튼 (전 > 후)

------------------------ 결과들

  • 홈화면

  • creat버튼 눌렀을 때

  • sqlite를 눌렀을 때

--- 최종 코드

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()

↑ CSS, 자바스크립트 복습 내용도 포함
f-string escape string (중괄호를 나오게 하려면 중괄호 두번씩 {{ }} )

학습한 내용 중 어려웠던 점

전체적으로 어려웠지만 강사님께서 지난번 학습 내용들을 한번씩 다시 설명해주시고, 이전에 배웠던 CSS와 자바스크립트의 내용도 flask에 적용시키며 복습하는 시간을 가질 수 있었다.

해결방법 작성

헷갈리고 어려웠던 파이썬부터 전체적으로 다시 강의를 보며 복습하고 따라해보기.

학습 소감

오늘로서, 이고잉 강사님의 수업이 모두 끝이 났다.
강사님과 수강생들 모두에게 주어진 시간이 부족했던 것은 사실이지만, 완전 초급 입문자가 대략적으로나마 코딩에 대해 알 수 있게 되었던 시간이었던 것 같다.

(으...갑자기 월말평가 무조건 만점만 pass라니...ㄷㄷ 너무 무섭)

0개의 댓글