상세 컨텐츠

본문 제목

[Python] 생활 코딩 python 강의 따라하기 4 (CRUD 중 수정 기능 구현하기)

Python

by Jjiveloper 2021. 5. 23. 20:30

본문

728x90

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. 파일 명 변경 시 바뀌는 값에는 경로를 추가해주지 않았다.

728x90
반응형

관련글 더보기