상세 컨텐츠

본문 제목

[Python] 생활 코딩 python 강의 따라하기 3 (CRUD 중 등록 기능 구현하기)

Python

by Jjiveloper 2021. 5. 23. 20:02

본문

728x90

index.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>
    <a href="create.py">글쓰기</a> # <-- 글 쓰기 링크 추가
    <h2>{title}</h2>
    <p>{description}</p>
    </body>
    </html>
'''.format(list=listStr,title=pageId, description=desc, update_link=modify))

 

html 출력란에 <a href="create.py">글쓰기</a> 추가

create.py 파일은 기존의 index.py 파일을 복붙해서 만들자.

 

create.py

<form action="process_create.py" method="POST">
        <p>
            <input type="text" name="title" placeholder="제목"/>
        </p>    
        <p>
            <textarea rows="4" name="desc" placeholder="본문"></textarea>
        </p>    
        <p><input type="submit"></p>  
</form>

추가되는 것은 이게 다임

파일을 저장하기 위한 form을 만들어줄 뿐... 이 이후가 중요하다!

 

일단 create.py파일 전체 코드 (react처럼 컴포넌트화 못시키나..? 코드 중복 불편...)

#!python
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

print("content-type: text/html; charset=utf-8\n")
import cgi,os

#os 모듈 이용해서 data폴더에 있는 파일 명들을 가져온 후 files에 저장
files = os.listdir('data')
listStr = ''
for item in files:  # files에 있는 리스트들을 반복문을 통해 <li>로 만들어준다.
    listStr += '<li><a href="index.py?id={id}">{id}</a></li>'.format(id=item)

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()
else:
    pageId = "Welcome"
    desc = "Hello, Web"

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="cerate.py">글쓰기</a>
    <form action="process_create.py" method="POST">
        <p>
            <input type="text" name="title" placeholder="제목"/>
        </p>    
        <p>
            <textarea rows="4" name="desc" placeholder="본문"></textarea>
        </p>    
        <p><input type="submit"></p>  
    </form>  
    </body>
    </html>
'''.format(list=listStr,title=pageId, description=desc))


process_create.py

#!python

import cgi
form = cgi.FieldStorage()

title = form["title"].value
desc = form["desc"].value


createFile = open('data/'+title, 'w')
createFile.write(desc)

createFile.close()

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

FieldStorage()를 이용해 페이지 정보를 받아오고

그 중에서도 form에서 보낸 name값을 찾아온다.

제목은 name="title"이였고, 본문은 name="desc"로 보냈으니까 name값 그대로 받아오면 됨

 

그리고 파일을 'r' read해오는 것이 아닌, 이번에는 'w' write 새로 작성하기로 한다.

경로는 'data' 아래에 파일명은 사용자가 적은 제목으로 지정하고

파일 내부의 내용은 사용자가 적은 본문내용으로 채운다.

 

그리고 파일을 열었으면 꼭 닫아준다. close()

 

파일 생성이 완료되고나면 페이지를 이동시켜준다. 

방법은 Location: 경로 를 적어주면 된다.

(파이썬은 print안에 적어야 실행이 되는 구조인가보다... content-type작성할 때도 pirnt 하던데...)

 

글을 쓰고, 파일을 올리고 나면, 방금 올린 글을 바로 확인할 수 있도록 index.py파일에서 방금 작성한 title을 id로 줘서 바로 볼 수 있도록 해준다.

 

참고로 여기 파일에는 내가 create.py파일에서 보낸 값을 조회해보고 싶다고 print를 해주면 에러난다. Location이랑 충돌하는 것 같은데..

가져온 값을 확인하고 싶다면 파일 생성하는 코드를 주석처리 해놓고 print해보쟙


Create 구현 결과 (분명히 제대로 저장했는데 여기부터 글이 날라가서 다시 적음..ㅠㅠ)

 

1. 글쓰기 버튼 클릭

2. 글 생성

title 과 description에 내용을 추가하고 제출한다.

 

3. 결과

글목록에 방금 추가한 title이 있고, 내용도 화면에 출력되는 모습을 볼 수 있다.

728x90
반응형

관련글 더보기