python) form 을 이용한 데이터 생성/전송 기능 구현 (Create)

jun_legend·2021년 5월 14일
0

Python-Web Application

목록 보기
6/11
post-thumbnail

"form 을 이용한 데이터 생성/전송 기능 구현 (Create)"

#!/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

0개의 댓글