본문 바로가기
개발자 일지/Phython

[파이썬 기초]form 데이터 전송 및 처리방법(CRUD-Update)

by 네빌링 2021. 3. 24.
반응형

-HTML form태그를 이용하여 파이썬 애플리케이션이 데이터를 받아서 처리하는 방법을 알아본다. CRUD중 Update를 구현한다.

-생활코딩 파이썬 강의를 바탕으로 학습 및 보충학습 하였다.

-파이썬은 3.9.2 ver를 사용한다.


(이전 파이썬 포스팅 예제와 연결되니 참고 부탁드립니다)

 

 목록의 데이터를 클릭하여 목록제목과 내용을 업데이트하는 방법을 알아본다.create버튼 옆에 update버튼을 만드는데, WEB이라는 메인페이지로 이동하면 update버튼이 안보이고 목록을 클릭하면 update버튼이 보이도록 분기처리한다.

 

update 버튼 만들기

index.py 일부

form = cgi.FieldStorage()
#a태그 클릭시 id값에 따른 pageId 분기처리
if 'id' in form:
    pageId = form["id"].value
    description = open('data/'+pageId,'r').read() #open함수로 내용 불러오기
    update_link = '<a href="update.py?id={}">update</a>'.format(pageId) #update 태그를 만들어 담기
else :
    pageId = 'welcome'
    description = 'Welcome!'
    update_link = '' #id가 없는경우(메인페이지 WEB) 빈값

 위와 같이 form에 id값이 있으면(if) update_link라는 변수에 update태그 버튼을 만들어 담는다. 만약 id값이 없으면(else) update_link에 빈 값을 준다. 그리고 위의 update_link 변수를 update 버튼이 있어야 할 위치에 format 기능을 통해 붙여넣는다.

 

index.py 일부

print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  {update_link} #update_link변수를 담아 WEB(제목)을 클릭시에는 빈값을 담는다
  <h2>{title}</h2>
  <p>{desc}
  </p>
</body>
</html>
'''.format(title=pageId, desc=description, listStr=listStr,update_link=update_link))

 

다음과 같이 화면에 update버튼이 추가되어 있다.

 

저 update 버튼은 WEB이라는 최상단 버튼을 클릭하면 분기처리로 인해 비활성화된다.

 

 

update 페이지 만들기

 update 페이지는 이전에 만든 create.py와 비슷하다. create.py를 복붙한 후 약간의 수정을 한다. update버튼을 누르면 기존 index에서 볼 수만 있었던 title, description를 수정할 수 있게 <input/>,<textarea/>에 담아야 한다. 다음과 같이 create.py를 복사,붙여넣기 후 일부 수정한다.

 

update.py

 

#!Python
print("Content-Type: text/html")
print()
import cgi, os  #os모듈을 import한다.

files = os.listdir('data') #[CSS,HTML,JavaScript]
listStr = ''
for item in files:
    listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)

form = cgi.FieldStorage()
#a태그 클릭시 id값에 따른 pageId 분기처리
if 'id' in form:
    pageId = form["id"].value
    description = open('data/'+pageId,'r').read() #open함수로 내용 불러오기
else :
    pageId = 'welcome'
    description = 'Welcome!'

print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  <form action="process_update.py" method="post">
    <input type="hidden" name="pageId" value="{form_default_title}"> #hidden태그를 만들어 기존 title(pageId) 담기
    <p><input type="text" name="title" placeholder="title" value="{form_default_title}"></p> #value에 값을 넣어줌
    <p><textarea rows="4" name="description" placeholder="description">{form_default_description}</textarea></p> #value에 값을 넣어줌
    <p><input type="submit"></p>
  </form>
  <h2>{title}</h2>
  <p>{desc}
  </p>
</body>
</html>
'''.format(title=pageId, desc=description, listStr=listStr, form_default_title=pageId, form_default_description=description))

 

 print('''...''')된 곳을 보면 hidden태그가 추가된 것을 볼 수 있다. title값과 같이 변동될 가능성이 있는 변수와 구분하여 변동전의 값을 보내주어 uppdate 처리시 사용한다.

 그 아래의 input태그와 textarea태그는 create.py의 것을 그대로 사용하되, value={form_default_title}value={form_defaul_description}을 format 기능을 이용하여 넣어준다. 이렇게 하면 목록을 클릭하자마자 기존의 title과 description을 가져올 수 있어 그 상태로 수정이 가능하다.

 

다음과 같은 페이지가 완성된다.

 

HTML 목록 클릭 후 form에 title과 description이 담겨있는 것을 볼 수 있음

 

 마지막으로 form action부분을 보면 process_update.py로 이동한다는 것을 알 수 있다. proccess_update.py를 작성한다.

 

update를 처리하기

process_create.py처럼 process_update.py를 만들어 update를 처리해준다.

 

process_update.py

#!Python
import cgi, os
form = cgi.FieldStorage()
pageId= form['pageId'].value
title= form['title'].value
description= form['description'].value

opened_file = open('data/' + pageId, 'w') #update.py에서 넘겨준 hidden값으로 경로를 담는다
opened_file.write(description) #지정된 경로에 description을 업데이트
opened_file.close()

os.rename('data/'+pageId,'data/'+title)	#파일명을 변경된 title명으로 바꿔주는 모듈 함수

#Redirection
print("Location: index.py?id="+title) #마지막에는 index.py로 id값에 맞게 이동
print()

 

우선 pageId=form['pageId'].value를 작성하여 hidden으로 넘겨준 pageId값을 받은 후, open_file =open('data/'+pageId,'w')로 작성해준다. 이러면 기존의 update한 목록의 title값이 변경되어도 hidden으로 보낸 기존 값으로 인해 기존 페이지에 description을 업데이트해줄 수 있다.

 

이후 os.rename 함수를 다음과 같이 사용한다.

os.rename('파일경로/파일명','파일경로/변경할파일명')

 

마지막으로 업데이트를 해보면 다음과 같이 업데이트 됨을 확인할 수 있다.

 

HTML을 HTML5로 변경하였음

 

반응형