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이 있고, 내용도 화면에 출력되는 모습을 볼 수 있다.
[Python] 생활 코딩 python 강의 따라하기 5 (CRUD 중 삭제 기능 구현하기) (0) | 2021.05.23 |
---|---|
[Python] 생활 코딩 python 강의 따라하기 4 (CRUD 중 수정 기능 구현하기) (0) | 2021.05.23 |
[Python] 생활코딩 강의 따라하기 2 (list 동적으로 추가하기-file읽어오기, url query가져오기)_부제: 파이썬 한글 깨짐 해결 (0) | 2021.05.23 |
[Python] 생활 코딩 python 강의 따라하기 1 (python 파일 웹에 띄우기) (0) | 2021.05.22 |