2022.4.1 개발일지 python

정성우·2022년 4월 1일
0

1.학습한 내용

from flask import Flask, request, redirect
import sqlite3
#sqlite3를 통해 database에 접근해 여러 동작을 실행 

app=Flask(__name__)

def template(content,id=None):
  contextUI=''
  if id !=None:
    contextUI='<input type="submit" value="delete" class="btn btn-dark">'
#contextUI에 빈값을 넣어주고 입력받은 id값이 None이 아닐경우에만 위의 input을 실행  
  data=sqlite3.connect('db.sqlite3')
  cs=data.cursor()
  cs.execute('SELECT*FROM topics')
  topics=cs.fetchall()
  data.close()
#data에 db.sqlite3를연결
#cs는 데이터에 접근할수있게해주는 커서
#execute ()안의 명령문 실행
# db.sqlite3안의 topics 전부를 'topics'에 저장
#data연결 종료
  liTags = ''
  for topic in topics:
    liTags = liTags + f'<li><a href="/read/{topic[0]}/">{topic[1]}</a></li>'
#topic[0]=id topic[1]=title topic[2]=body
  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: red solid 10px;
        }}
      </style>
      <script>
        function changebackground(){{
        document.querySelector('body').style.backgroundColor="black";
        }}
      </script>
    </head>
    <body class="container">
      <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>
      <input type="button" value="background" onclick="changebackground()">
    </body>
  </html>
  '''
#위에 contextUI에 id가 None이면 빈값이므로 아무것도 실행되지않고
#id가 None이 아니면 submit 버튼이 생기고 form에 의해 눌렀을시 action이 실행됨
#create와 delete를 묶어서 bootstrap기능으로 꾸밈
      
# 누르면 changebackground()를 실행하는 버튼 추가 
 
@app.route("/")
def index():
  return template('<h2>Welcome</h2>Hello, WEB!')

@app.route("/read/<int:id>/")
def read(id):
  data=sqlite3.connect('db.sqlite3')
  cs=data.cursor()
  cs.execute("SELECT*FROM topics WHERE id=?",(id,))
  topic=cs.fetchone()
  data.close()
# topics에서 id가 입력받은 id와 같은 데이터를 추출해 topic에 저장
  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():
  data=sqlite3.connect('db.sqlite3')
  cur=data.cursor()
  title=request.form['title']
  body=request.form['body']
  cur.execute('INSERT INTO topics (title,body) VALUES(?,?)',(title,body))
  id=cur.lastrowid
  data.commit()
  data.close()
  return redirect(f'/read/{id}/')
#request받은 title과 body를 title과 body에 저장
#topics에 title과 body 추가
#데이터 수정후 lastrowid를 id에 저장
#데이터 수정 종료 /read/id/로 redirect

@app.route("/delete/<int:id>/",methods=['POST'])
def delete(id):
  data=sqlite3.connect('db.sqlite3')
  cur=data.cursor()
  cur.execute('DELETE FROM topics WHERE id=?',(id,))
  data.commit()
  data.close()
  return redirect('/')
# topics의 id와 입력받은 id와 같은 topics 데이터를 삭제

app.run()

실행결과
첫화면
create
delete
background

학습한 내용 중 어려웠던 점 또는 해결못한 것들
delete버튼을 눌렀을때 한번더 확인하는 팝업창이 있으면 좋겠다.

해결방법 작성
tkinter.messagebox.askyesno(title,body)
import 해오는것부터 오류가난다 뭐가문제일까

학습 소감
예외처리를 통해서 read를 했을때만 delete 버튼이 생성되게하는걸 배웠다. 재미있었음

0개의 댓글