python) 데이터 수정 기능 구현 (Update)

jun_legend·2021년 5월 14일
0

Python-Web Application

목록 보기
8/11
post-thumbnail

"데이터 수정 기능 구현 (Update)"

#!/usr/local/bin/python3
print("Content-Type: text/html")
print()
import cgi, os

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

form = cgi.FieldStorage()
if 'id' in form:
  pageId = form["id"].value
  description = open('data/'+pageId, 'r').read()
  
else:
  pageId = 'Welcome'
  description = 'Hello, web'
  
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>
  <h2>{title}</h2>
  <p>{desc}</p>
</body>
</html>
'''.format(
  title = pageId, 
  desc = description, 
  listStr = listStr))

위와 같이
사용자가 데이터를 생성하고 전송할 수 있는 웹 애플리케이션에서
form 을 통해 데이터를 수정(update) 할 수 있는 기능을 구현해보자.


1) id 값이 있는 제목들만 update 링크가 노출되도록 세팅

id 값이 있는 제목 페이지에서는 update 링크를 노출하고
id 값이 없는 홈페이지(index.py)에서는 update 링크가 노출되지 않도록

id 값 유무를 조건으로 하는 기존의 조건문에
아래와 같은 코드를 추가하자.

if "id" in form:
    update_link = '<a href="update.py?id={}">update</a>'
    .format(pageId)
else:
    update_link = " "  

2) 포매팅을 사용해서 조건문의 변수로 update 링크 걸기

<a href="create.py">create</a>
{update_link}
	.
	.
	.
'''.format(
  title = pageId, 
  desc = description, 
  listStr = listStr, 
  update_link = update_link))

3) 수정 데이터를 입력할 update.py 파일을 만들고 실행 권한 부여하기

(터미널 - update.py가 있는 디렉토리에서 실행)
sudo chmod a+x update.py


4) 데이터를 수정할 수 있는 폼 만들기

기존에 저장되어 있던 데이터에 대한 수정 기능을 구현하는 것이므로
title 폼과 description 폼에
현재 저장되어있는 데이터가 적혀있도록 세팅하자.

<form action="process_update.py" method="post">
  <p><input type="text" name="title" value="{title}"><p>
  <textarea rows="4" name="title">{desc}</textarea>
  <input type="submit">
</form>
	.
	.
	.
'''.format(
  title = pageId, 
  desc = description, 
  listStr = listStr, 
  update_link = update_link))
  • < input value=" " >
    기본으로 value 속성의 값을 세팅해줌

웹 페이지를 리로드 해보면 아래와 같이
컨텐츠별로 저장되어 있던 title 값과 description 값이 미리 적혀져있다.


5) pageId 값을 전송하는 폼 추가 세팅하기

title 값을 수정하게 되면,
title 은 데이터를 구분할 수 있던 식별자로써의 기능을 상실하게 되어
데이터를 구분할 수 있게 해주는 별도의 식별자가 필요하다.
pageId 값을 식별자로써 title값과 별개로 전송할 수 있게 세팅하자.

<input type="hidden" name="pageId" value="{title}">
  • < input type="hidden" >
    페이지에서 숨겨짐

  • pageId 값은 데이터를 구분할 수 있는 식별자로써 전송되어야 하지만
    수정되어서도 안되고 사용자에게 굳이 노출하지 않아도 될 정보이므로 숨겨둠.


6) 완성된 update.py 의 코드는 아래와 같다.

#!/usr/local/bin/python3
print("Content-Type: text/html")
print()
import cgi, os

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

form = cgi.FieldStorage()
if 'id' in form:
  pageId = form["id"].value
  description = open('data/'+pageId, 'r').read()
  update_link = '<a href="update.py?id={}">update</a>'.format(pageId)
else:
  pageId = " "
  description = " " 
  update_link = " "
  
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}
  <form action="process_update.py" method="post">
    <p><input type="text" name="title" value="{title}"></p>
    <textarea rows="4" name="description">{desc}</textarea>
    <p><input type="submit"></p>
  </form>
  <h2>{title}</h2>
  <p>{desc}</p>
</body>
</html>
'''.format(
  title = pageId, 
  desc = description, 
  listStr = listStr, 
  update_link = update_link))

7) 수정된 데이터를 수신할 process_update.py 파일을 만들고 실행 권한을 부여

(터미널 - process_update.py가 있는 디렉토리에서 실행)
sudo chmod a+x process_update.py


8) 수정된 데이터 값을 받아 글 제목 목록 및 파일과 연동시키기

import cgi
form = cgi.FieldStorage()
pageId = form["pageId"].value
title = form["title"].value
description = form["description"].value
opened_file = open('data/'+pageId, 'w')
opened_file.write(description)
opened_file.close()
  • form["pageId"].value
    pageId 값을 받기위한 코드

9) 파일의 이름을 바꾸는 코드를 적용

title 값이 수정되면 파일의 이름이 바뀌게 되므로
파일의 이름을 바꾸는 코드를 검색해보면 아래와 같은 코드를 확인 할 수 있다.

os.rename(src, dst)
  • os : os 모듈 (import os 로 불러와야 함)

  • src : 현재 파일의 경로와 파일명 (source 의 약자)

  • dst : 수정하고자 하는 파일의 경로와 파일명 (destination 의 약자)


파일의 이름을 변경하는 코드를 적용하면 아래와 같다.
import os
os.rename('data/'+pageId, 'data/'+title)
  • pageId 값을 수정된 title 값으로 바꿔준다는 의미

10) 수정된 데이터를 수신하고 파일명과 내용을 수정한 후
redirection 하는 process_update.py 의 최종 코드는 아래와 같다.

#!/usr/local/bin/python3

import cgi, os
form = cgi.FieldStorage()
pageId = form["pageId"].value
title = form["title"].value
description = form["description"].value

opened_file = open('data/'+pageId, 'w')
opened_file.write(description)
opened_file.close()

os.rename('data/'+pageId, 'data/'+title)

print("Location: index.py?id="+title)
print()

이제 컨텐츠 페이지에 접속해서 update 를 클릭하고
title 값과 description 값을 수정해주면
홈페이지(index.py)의 목록과 data 디렉토리의 파일이
수정되는 것을 확인 할 수 있다.




[출처] 생활코딩 WEB2 - Python
https://opentutorials.org/module/3357

0개의 댓글