CGI Network [KOR]



network_cgi.py : CGI 네트워크를 오픈한다
CGI : 웹 서버와 클라이언트 사이에서 정보를 주고 받는 방법이나 규약, 대화형 웹 페이지를 운영한다
from http.server import CGIHTTPRequestHandler, HTTPServer
port = 8888

class Handler(CGIHTTPRequestHandler):
    cgi_directories = ['/cgi-bin']  # 경로 설정, 폴더이름은 무조건 cgi-bin 으로 해야한다.
    
serv = HTTPServer(('127.0.0.1', port), Handler)
print('웹 서비스 시작...')
serv.serve_forever()


main.html : 메인화면을 담당한다
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지</title>
</head>
<body>
<h1>여기가 메인 홈페이지</h1>
<ol>
	<li><a href="cgi-bin/hello.py">hello 파이썬 문서 요청</a></li>  <!-- 파이썬 부르기 -->
	<li><a href="cgi-bin/world.py">world 파이썬 문서 요청</a></li>
	<li><a href="cgi-bin/my.py?name=tom&age=23">my(get 방식으로 자료 전달)</a></li>
	<li><a href="friend.html">친구자료 입력</a></li>
	<li><a href="cgi-bin/sangpum.py">상품 자료</a></li>  <!-- db 연동해서 부를거임 -->
</ol>
</body>
</html>


hello.py : 여기서는 파이썬으로 처리한 내용을 클라이언트에게 전송한다
munja = '파이썬 변수에 값 기억'
kor = 50
eng = 40
hap = kor + eng

print('Content-Type:text/html;charset=utf-8\n')  # 웹용 파이썬
print('<html><body>')

print('<b>안녕하세요</b>강영진의 파이썬 문서입니다<br>')
print('내 이름은 강영진 입니다<br>')
print('minja : %s hap : %d'%(munja, hap))  # 파이썬 변수도 웹으로 출력 가능

print('</body></html>')


world.py : 여기서도 파이썬으로 처리한 내용을 클라이언트에게 전송한다
s1 = '자료1'
s2 = '강영진'

print('Content-Type:text/html;charset=utf-8\n')  # 웹용 파이썬
print("""
<html>
<body>
<h1> 난 월드 </h1>
파이썬 값 출력 : {0}, {1} <br>
<a href='../main.html'>메인으로</a>
</body>
</html>
""".format(s1, s2))


my.py : client가 넘겨준 정보를 수신한다 (name = tom, age = 23)
import cgi

form = cgi.FieldStorage()  # name=tom&age=23 이부분을 가져온다

irum = form['name'].value
nai = form['age'].value + '살'

print('Content-Type:text/html;charset=utf-8\n')  # 웹용 파이썬
print("""
<html>
<body>
넘겨준 자료 보기<br>
이름은 : {0}, 나이는 : {1}
</body>
</html>
""".format(irum, nai))


friend.html : friend.py 에게 넘겨줄 입력값을 받는 폼 html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

** 친구 자료 ** <br>
<!-- 입력 폼 이용 -->
<form action="cgi-bin/friend.py" method="get"> <!-- get 대신 post를 쓰면 보안이 유지가 된다 (위에 value가 안뜬다) --> 
이름 : <input type="text" name="name"><br>
전화 : <input type="text" name="phone"><br>
성별 : 
<input type="radio" name="gen" value="남" checked="checked">남자
<input type="radio" name="gen" value="여">여자
<br><br>
<input type="submit" value="전송">  <!-- button 이 아니라 submit 이라 해야 작동을 한다, 누르면 action 발동 -->
</form>

</body>
</html>

friend.py : friend.html 에게 넘겨받은 값으로 클라이언트에게 반환한다
import cgi

form = cgi.FieldStorage()  # name=tom&age=23 이부분을 가져온다

name = form['name'].value  # friend.html 에서 값 받아오기
phone = form['phone'].value
gender = form['gen'].value

print('Content-Type:text/html;charset=utf-8\n')  # 웹용 파이썬
print("""
<html>
<body>
넘겨준 자료 보기<br>
이름은 : {0}, 전화는 : {1}, 성별은 : {2}
</body>
</html>
""".format(name, phone, gender))


sangpum.py : MariaDB와 연동하여 상품 테이블을 클라이언트에게 반환한다
import MySQLdb
import ast  # sting 파일을 dict로 읽는다
import os

# 주소 파일 읽어오기
with open(os.getcwd() + '\\mariadb.txt', 'r') as f:  # os.getcwd() 를 통해 파일위치를 찾는다
    config = ast.literal_eval(f.read())

print('Content-Type:text/html;charset=utf-8\n')  # 웹용 파이썬
print("""
<html>
<body>
<b>상품 정보</b>
<table border = "1">
<tr><th>코드</th><th>상품명</th><th>수량</th><th>단가</th></tr>
""")

try:
    conn = MySQLdb.connect(**config)
    cursor = conn.cursor()
    cursor.execute("select * from sangdata")
    datas = cursor.fetchall()
    for code, sang,su,dan in datas:  # html 문에 넣어준다
        print("""
        <tr>
        <td>{0}</td>
        <td>{1}</td>
        <td>{2}</td>
        <td>{3}</td>
        </tr>
        """.format(str(code), sang, su, dan))

except Exception as e:
    print('오류 : ', e)

finally:
    cursor.close()
    conn.close()
    
print("""
</table>
</body>
</html>
""")  # 테이블 형식으로 출력, border="1" 은 테두리를 생성한다.


최종 출력 화면

Categories : Practice