Create를 했다면 Update는 좀 쉬울 것이다! (아마!!)
index.py
form = cgi.FieldStorage() # cgi에서 제공하는 함수를 통해 페이지에 있는 정보들을 가져옴
if 'id' in form:
pageId = form["id"].value
f = open('data/'+pageId,'r', encoding='UTF-8')
desc = f.read()
f.close()
modify = '<a href="modify.py?id={}">수정하기</a>'.format(pageId) #<-여기 추가
else:
pageId = "Welcome"
desc = "Hello, Web"
modify = '' #<-여기 추가
print('''
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>web python </title>
</head>
<body>
<h1><a href="index.py">Web</a></h1>
<ol>
{list}
</ol>
<a href="create.py">글쓰기</a>
{update_link} #<-여기 추가
<h2>{title}</h2>
<p>{description}</p>
</body>
</html>
'''.format(list=listStr,title=pageId, description=desc, update_link=modify))
총 3군데 추가하면 된다...
update_link를 변수로 관리하는 것은 welcome페이지에서는 수정하기 링크가 보일 필요가 없기 때문이다.
modify.py 파일은 앞서 만들었던 create.py파일을 그대로 복붙한다.
modify.py
print('''
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>web python </title>
</head>
<body>
<h1><a href="index.py">Web</a></h1>
<ol>
{list}
</ol>
<form action="process_modify.py" method="POST">
<p>
<input type="text" name="new_title" value="{new_title}" placeholder="제목"/>
<input type="hidden" name="old_title" value="{old_title}"/>
</p>
<p>
<textarea rows="10" name="new_desc" placeholder="본문">{old_desc}</textarea>
</p>
<p><input type="submit"></p>
</form>
</body>
</html>
'''.format(list=listStr,old_title=pageId ,new_title=pageId, old_desc=desc))
추가한 내용:
1. title은 변경되기 때문에 기존의 title 값을 가지고 있다가 전달해줘야하므로 old_title 추가 (기존의 파일명을 이용해서 파일을 검색하고 수정해야되니까)
2. new_title과 new_desc는 기존에 가지고 있던 값을 보여주되 (.format()을 통해 설정), 수정한 내용을 전달해줘야 한다. (구분하기 쉬우려고 이름을 new_ 로 지었음)
3. form은 submit 시 process_modify.py 로 전달하게 된다.
process_modify.py
#!python
import cgi, os
form = cgi.FieldStorage()
old_title = form["old_title"].value
new_title = form["new_title"].value
desc = form["new_desc"].value
modifyFile = open('data/'+old_title, 'w+')
modifyFile.write(desc)
modifyFile.close()
os.rename('data/'+old_title, 'data/'+new_title)
print("Location: index.py?id="+new_title)
print()
1. 기존의 title 값을 가져온다. old_title로 보냈으므로 그대로 받아옴
2. 새로 수정한 title의 값과 description의 값을 가져온다.
3. 파일을 open하는데 경로는 data 폴더의 기존에 있던 title값이고, w+ 모드로 실행한다.
w+는 기존에 가지고있던 파일의 내용을 새로 작성할 때 사용한다고 한다. (이고잉님은 그냥 w로 하시긴했는데, 나는 그냥 w+로 사용해봄.)
4. 그리고 파일의 내용을 desc내용으로 넣어주고 close()해준다.
5. 파일 명 수정하기는 os의 rename()함수를 사용하면 된다. (close()한 이후에 파일명을 수정해야한다!)
os.rename(기존 경로, 바꿀 파일 명) 이런 형식인데, 바꿀 파일 명에도 동일하게 경로를 적어줘야하더라... 파일 명만 적었다가 에러났는데 이유를 못찾았었음 ㅠㅠ 삽질...ㅠㅠ
6. 수정이 끝났으면 수정한 내용을 보여주는 index.py로 id값과 함께 보낸다.
끝!
Update 구현 결과
1. 수정하기 버튼 클릭
2. 수정
3. 제출 시 파일 명, 내용이 수정된 모습을 볼 수 있다.
+ welcome 화면에서는 수정하기 링크가 보이지 않는다.
내가 했던 실수
1. modify.py에서 format을 제대로 안해줬다.
2. modify.py에서 설정한 form 안의 input name값과 process_modify.py에서 받아오는 name값을 일치시키지 않았다.
3. file을 open하고 close 하기 전에 파일 명을 바꾸려고 했다.
4. 파일 명 변경 시 바뀌는 값에는 경로를 추가해주지 않았다.
[Python] 생활 코딩 python 강의 따라하기 5 (CRUD 중 삭제 기능 구현하기) (0) | 2021.05.23 |
---|---|
[Python] 생활 코딩 python 강의 따라하기 3 (CRUD 중 등록 기능 구현하기) (0) | 2021.05.23 |
[Python] 생활코딩 강의 따라하기 2 (list 동적으로 추가하기-file읽어오기, url query가져오기)_부제: 파이썬 한글 깨짐 해결 (0) | 2021.05.23 |
[Python] 생활 코딩 python 강의 따라하기 1 (python 파일 웹에 띄우기) (0) | 2021.05.22 |