2022.4.1開発ログpython


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/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
      <script src="https://cdn.jsdelivr.net/npm/[email protected]/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)
輸入から誤って貧しい家族まで
学習の心得.
例外処理によりdeleteボタンを生成できるのは、読むときだけであることを学びました.おもしろい