#!/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>
<h2>{title}</h2>
<p>{desc}</p>
</body>
</html>
'''.format(title = pageId, desc = description, listStr = listStr))
위와 같이
여러 데이터가 (글의 제목과 본문, 제목 리스트가) 파일로 제어되는
웹 애플리케이션에서
데이터를 생성하고 전송할 수 있는 기능을 구현해보자.
1) 데이터를 생성할 수 있는 페이지인 create.py 라는 파일을 만들고 실행 권한을 부여
(터미널 - create.py가 있는 디렉토리에서 실행)
sudo chmod a+x create.py
참고) create.py 는 index.py 와 코드가 유사하므로 index.py 를 복제해서 생성하자
2) index.py 에서 create.py 로 이동할 링크 걸기
<a href="create.py">create</a>
3) index.py 에서 데이터를 생성할 수 있는 양식(폼) 만들기
<form action="process_create.py"> <p><input type="text" name="title" placeholder="title"><p> <textarea rows="4" name="title" placeholder="description"></textarea> <input type="submit"> </form>
< form action=" " >
데이터를 어느 곳으로 보낼지 설정
< input type="text" >
텍스트를 입력할 수 있는 (1개)칸을 생성
< input type="submit" >
submit(제출) 버튼을 생성
< input name=" " > & < textarea name=" " >
데이터를 전송할 때 ㅇㅇ 이라는 이름으로 전송
< input placeholder=" " > & < textarea placeholder=" " >
입력 칸 안에 보여지는 문구
create.py 페이지에서 데이터 작성 양식만 보이도록
else 조건문의 pageId 값과 description 값은 " " 으로 변경
줄바꿈을 위해 input 태그를 p 태그로 감싸줌 (p 태그는 블록요소)
웹 페이지를 리로드 해보면 아래와 같이 폼이 갖춰져있다.
4) form 태그의 전송방법을 post로 변경하자.
<form action="process_create.py" method="post">
- form 태그에 method 속성을 적지 않으면 기본값으로 get 을 갖는다.
참고)
데이터를 작성해서 전송하는 경우,
전송 페이지의 주소에 쿼리스트링이 있으면
다른 사용자가 해당 주소로 접속해서
전송된 데이터를 수정, 삭제할 수 있는 문제가 발생할 수 있다.
사용자가 정보를 가져오는(get하는) 웹사이트의 경우,
get 방식을 사용하면 url 주소에 쿼리스트링을 포함하게 된다.
url 을 쿼리스트링 까지 포함해서 공유하면 방문자들은 보다 정확한 주소로 접속할 수 있다.
하지만 사용자가 데이터를 생성하거나 수정, 삭제해서 전송하는 경우엔
다른 사용자가 전송된 데이터에 접근할 수 없도록
데이터를 은밀하게 보내는 post 방식을 사용해야한다.
5) create.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()
else:
pageId = ''
description = ''
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>
<form action="process_create.py">
<p><input type="text" name="title" placeholder="title"></p>
<textarea rows="4" name="title" placeholder="description"></textarea>
<p><input type="submit"></p>
</form>
<h2>{title}</h2>
<p>{desc}</p>
</body>
</html>
'''.format(title = pageId, desc = description, listStr = listStr))
[출처] 생활코딩 WEB2 - Python
https://opentutorials.org/module/3357