2022.3.31 개발일지 python

12392 단어 pythonFlaskGlitchFlask

1.학습한 내용

request 유저가 입력한 값 가져오기
redirect 다른 url로 이동

from flask import Flask, request, redirect

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 ...."}
]

nextID=len(topics)+1
#topics에 새로운 값을 넣어주기위해 변수생성


def template(content,id=None):
  liTags = ''
  for topic in topics:
    liTags = liTags + f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
  return f'''
  <html>
    <body>
      <h1><a href="/">WEB</a></h1>
      <ol>
        {liTags}
      </ol>
      {content}
      <ul>
        <li><a href="/create/">create</a></li>
        <li>
          <form action="/delete/{id}/" method="POST">
            <input type="submit" value="delete">
          </form>          
        </li>
      </ul>
    </body>
  </html>
  '''
# template 함수정의 parameter content,id
# liTags ,content 출력 /create/주소로 링크
# get이 아닌 post형식을 지닌 action을 추가
#delete를 submit하면 deleteid주소로 이동

@app.route("/")
def index():
  return template('<h2>Welcome</h2>Hello, WEB!')

@app.route("/read/<int:id>/")
def read(id):
  title = ''
  body = ''  
  for topic in topics :
    if topic['id'] == id:
      title = topic['title']
      body = topic['body']
      break;
  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)
# create가 submit 되면 create_process 이동 POST형식

@app.route('/create_process/',methods=['POST'])
def create_process():
  global nextID
  title=request.form['title']
  body=request.form['body']
  newTopic={'id':nextID,'title':title,'body':body}
  topics.append(newTopic)
  nextID=nextID+1
  return redirect(f'/read/{nextID-1}/')
#nextID를 글로벌변수로 지정 create_process()내에서 변경한 값이 유지되도록
#request를 통해 사용자가 입력한 title과 body를 받아와 저장
#newTopic이라는 값을만들어 append로 topics에 추가
#nextID+1을 해주어 다음에 덮어쓰기 방지
#read/nextid-1로 페이지이동

@app.route("/delete/<int:id>/",methods=['POST'])
def delete(id):
  for topic in topics:
    if topic['id']==id:
      topics.remove(topic)
      break;
  return redirect('/')
#deleteid로 이동되었을때 반복문으로 id가 topic의 id와 같다면 그 topic을 제거하고 멈춤 그리고 홈페이지로 이동

app.run()

실행결과



학습한 내용 중 어려웠던 점 또는 해결못한 것들
nextID=4
기존 topics에 데이터가 늘어나면 수정을 해야한다.
read를 선택하지않고 delete를 누르면 오류가나는데 예외처리를 하고싶다.
delete버튼을 눌렀을때 한번더 확인하는 팝업창이 있으면 좋겠다.

해결방법 작성
nextID=len(topics)+1
@app.route(delete)안에 if문을 만들어야 할거같다.
아니면 delete버튼을 read를 선택했을때만 나오게해도 될것같다. thinker.messagebox.askyesno(title,body)

학습 소감
create버튼을 눌렀을때 사용자가 입력한 title과 body를 받아와서 append로 새로운 페이지를 생성하고 delete버튼을 눌렀을때 remove로 지우고 redirect로 다른 주소로 보내는걸 배웠는데 재미있었다.

좋은 웹페이지 즐겨찾기