교육 12일차 강의

구성본·2022년 4월 1일
post-thumbnail

1.학습한 내용

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 black;        
        }}
        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></li>     
        {contextUI}
      </div>
    </form>   
  </body>
</html>
  '''

-flask를 통해 웹서버 실행
-form으로 접근, route로 접근, 함수가 return하는 값을 애플리케이션이 응답해준다.
-return에서 중복되는 값을 없애기 위해 template 사용
-li 목록 = topics에서 topic을 하나씩 꺼내 li 구성, 출력
-fetchall = 데이터베이스 정보를 가져와서 파이썬화 시켜주는 것

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

-template에 전달하는 route

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

-글 생성은 form 태그가 필요
-웹브라우저가 데이터를 가져오겠다면 기본값은 GET, url을 통해 데이터 전송
-서버를 변경하겠다면 POST사용, url이 아닌 방식으로 전송, 데이터 한계가 없다

@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))
  conn.commit()
  id = cs.lastrowid
  conn.close()
  return redirect(f'/read/{id}/')

-웹브라우저가 서버로 전송한 title body값을 알기 위해서 request 사용
-commit 사용하기 전까진 wrire가 대기중인 상태
-마지막행의 primary 키를 위해 lastrowid 사용


@app.route('/redirect')
def af():
  return redirect('/')

@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.run()

-삭제도 변경이기 때문에 POST방식 사용
-sqlite3 데이터베이스에 연결
-redirect로 원문으로 돌아간다

-터미널 => sqlite3 => .open db.sqlite3 => db파일 생성
=> CREATE TABLE topics( id INTEGER PRIMARY KEY, title TEXT NOT NULL, body TEXT); => 성공 (.schema topics를 하면 구조를 다시 보여줌)
=> INSERT INTO topics(title,body) VALUES('SQLite', 'SQLite is...'); 하면 내용입력
=> SELECT * FROM topics; 입력한 데이터 확인가능
-ls -l하면 만들어놓은 데이터베이스 파일 확인 가능

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

-execute = 수행하다, fatch(데이터를 가져오겠다)all(전부)

-create.py

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

import read

2.학습내용 중 어려웠던 점

  • py를 연결하는거라던가 각기 다른 언어들을 섞어서 전체적으로 사용하는게 생각보다 많이 어려운 것 같다.

3.해결방법

  • 선생님이 마지막에 말씀하신것 처럼 시간을 들여 배웠던것들을 계속 사용해보고 만들어보고 glich에 쌓아보고, 뭐든 해봐야 할 것 같다. 다행히 생활코드 사이트를 통해서 선생님이 강의 하시는 여러가지 자료들이 있어서 도움을 받아가며 해봐야 할 것 같다.

4.학습소감

  • 2주 동안의 이고잉 선생님의 강의가 마무리됐다. 지금까지 배운건 가장 기초적이고 기본적인것에 지나지 않는다는 점에 놀랍고 걱정이 된다. 다음주부터는 좀 더 본격적으로 강의가 시작된다고 들었는데 과연 잘 따라갈 수 있을지 걱정된다. 그저 시간을 갈아넣는것 말고는 방법이 없는 것같다.
    오늘도 게으름을 하나씩 줄여나가는 어제보다 나은 오늘이 되도록 해보자.
profile
코딩공부중

0개의 댓글