#!/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))
웹 페이지를 리로드 해보면 아래와 같이
컨텐츠별로 저장되어 있던 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()
9) 파일의 이름을 바꾸는 코드를 적용
title 값이 수정되면 파일의 이름이 바뀌게 되므로
파일의 이름을 바꾸는 코드를 검색해보면 아래와 같은 코드를 확인 할 수 있다.
os.rename(src, dst)
os : os 모듈 (import os 로 불러와야 함)
src : 현재 파일의 경로와 파일명 (source 의 약자)
dst : 수정하고자 하는 파일의 경로와 파일명 (destination 의 약자)
import os os.rename('data/'+pageId, 'data/'+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