8. 웹과데이터베이스연결응용 순천향대학교컴퓨터공학과이상정 순천향대학교컴퓨터공학과 1 학습내용 파이썬과데이터베이스연결 웹과데이터베이스연결 로그인페이지예 순천향서핑대회예 순천향대학교컴퓨터공학과 2
파이썬과 SQLite3 연결 sqlite3 모듈을사용하여파이썬과 SQLite3 데이테베이스연동프로그램작성 데이터베이스연결을오픈, 종료및내보내기 sqlite3.connect(filename) filename: 데이터베이스파일 데이터베이스파일이없으면새로운파일을생성 연결오픈이성공하면연결객체 (connection object) 를리턴 connection.close() 데이터베이스연결종료 connection.commit() 데이터베이스로내보내기 (commit) 이를실행하지않으면수정된내용이데이터베이스에반영되지않음 순천향대학교컴퓨터공학과 3 import sqlite3 conn = sqlite3.connect( connect('member.db db') print("opened database successfully"); conn.close() 순천향대학교컴퓨터공학과이상정 4
SQL 실행 SQL 문을실행하기위해서는연결객체를사용하여커서객체 (cursor object) 를생성하고, 이를통해 SQL문을실행 커서객체생성 connection.cursor() 커서객체를리턴 SQL 문실행 cursor.execute(sql) sql: SQL 문 순천향대학교컴퓨터공학과 5 회원가입데이터베이스예 웹접속을위한회원가입데이터베이스예 데이터베이스이름 : member.db 테이블이름 : meminfo 필드 ( 열 ) 계정이름 : id, 텍스트 / primary key 패스워드 : passwd, 텍스트 이름 : name, 텍스트 가입시간 : time, 텍스트 meminfo 테이블생성 create table meminfo (id text primary key, passwd text, name text, time text); 순천향대학교컴퓨터공학과 6
SQL 실행 테이블생성 import sqlite3 conn = sqlite3.connect('member.db') print("opened database successfully"); cursor = conn.cursor() cursor.execute(''' create table meminfo (id text primary key, passwd text, name text, time text); ''') print("table created successfully"); conn.commit() conn.close() 순천향대학교컴퓨터공학과이상정 7 시험주행 순천향대학교컴퓨터공학과 8
SQL 실행 행삽입 (1) 2 개의행삽입예 남운영, wynam, n1234 insert into meminfo (id, passwd, name, time) values ( 'wynam', 'n1234', ' 남운영 ', '2015-05-01 13:40:50'); 김은해, ehkim, k1234 insert into meminfo (name, id, passwd, time) values ( 'ehkim', 'k1234', ' 김은해 ', '2015-05-01 13:50:10'); cursor.execute() 행삽입실행 보안을위해행삽입시직접데이터값입력대신? 로표시하고, 대응되는변수나열 순천향대학교컴퓨터공학과 9 SQL 실행 행삽입 (2) cursor.execute() 행삽입예 id1 = 'wynam' pwd1 = 'n1234' name1 = ' 남운영 ', 'gdhong', 'h1234', datetime ('now', 'localtime')); time1 = datetime.datetime.now() cursor.execute(''' insert into meminfo (id, passwd, name, time) values(?,?,?,?)''', (id1, pwd1, name1.encode("cp949"), time1)) 한글저장시윈도우프롬트창에서표시되도록 cp949 로인코드 cp949 는마이크로소프트에서사용하는한글코드 순천향대학교컴퓨터공학과 10
컴퓨터와 import sqlite3 현대기술 import datetime conn = sqlite3.connect('member.db') print("opened database successfully"); cursor = conn.cursor() cursor() id1 = 'wynam' pwd1 = 'n1234' name1 = ' 남운영 ' time1 = datetime.datetime.now() cursor.execute(''' insert into meminfo (id, passwd, name, time) values(?,?,?,?)''', (id1, pwd1,name1.encode("cp949"), time1)) print("first user inserted"); id2 = 'ehkim' pwd2 = 'k1234' name2 = ' 김은해 ' time2 = datetime.datetime.now() cursor.execute(''' insert into meminfo (id, passwd, name, time) values(?,?,?,?)''', (id2, pwd2, name2.encode("cp949"), time2)) print("second user inserted"); conn.commit() conn.close() 순천향대학교컴퓨터공학과이상정 11 시험주행 순천향대학교컴퓨터공학과 12
SQL 실행 데이터조회 데이터가져오기 cursor.fetchone() SQL 질의결과로생성된하나의행을가져옴 cursor.fetchall() SQL 질의결과로생성된모든행을가져옴 데이터조회예 cursor.execute( execute(''' select * from meminfo''' ) rows = cursor.fetchall() 순천향대학교컴퓨터공학과 13 SQL 실행 데이터조회예 import sqlite3 import datetime conn = sqlite3.connect('member.db') print("opened database successfully"); cursor = conn.cursor() cursor() cursor.execute(''' select * from meminfo''' ) rows = cursor.fetchall() for row in rows: print("id:%s %s, password:%s, name:%s %s, time:%s" % (row[0], row[1], row[2].decode("cp949"), row[3])) conn.close() close() 순천향대학교컴퓨터공학과이상정 14
시험주행 순천향대학교컴퓨터공학과 15 SQL 실행 열이름으로조회 열의인덱스가아닌이름으로조회시다음을지정 conn.row_factory = sqlite3.row import sqlite3 conn = sqlite3.connect('member.db') print("opened database successfully"); conn.row_factory = sqlite3.row cursor = conn.cursor() cursor.execute(''' select * from meminfo''' ) rows = cursor.fetchall() for row in rows: print("id: %s, password: %s, name: %s, time: %s" % (row['id'], row['passwd'], row['name'].decode("cp949"), cp949 row['time'])) conn.close() 순천향대학교컴퓨터공학과 16
로그인폼페이지 로그인폼페이지, loginform.html 계정, 비밀번호입력 로그인처리페이지 (loginproc.py) 로이동 계정이없으면회원가입 회원가입폼페이지 (memform.py) 이동 순천향대학교컴퓨터공학과이상정 17 loginform.html <html> <head> <title> 로그인 </title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <h1> 로그인 </h1> <hr> <form method="post" " action="/cgi-bin/loginproc.py"> / " 계정 : <input name="id" type="text"> <br><br> 비번 : <input name="passwd" type="password"> <br><br> </form> <p> <hr> <input type="submit" value=" 로그인 "> <br> <input type="reset" " value=" 취소 "> <br> <form method="post" " action="memform.html"> <input type="submit" value=" 회원가입 "> <br> </form> </body> </html> 순천향대학교컴퓨터공학과이상정 18
로그인처리 로그인처리페이지, loginproc.py 로그인페이지의계정, 비밀번호파라미터를전달받음 계정과비밀번호를데이터베이스와비교하여일치하면순천향서핑대회폼페이지 (surfform.html) 로이동하고, 일치하지않으면에러메시지출력 앞의데이터베이스 member.db를 C: Apache24 cgi-bin 디렉토리로복사 순천향대학교컴퓨터공학과이상정 19 컴퓨터와 #!/Python34/python 현대기술 # import cgi import cgitb; cgitb.enable() import sqlite3 loginproc.py # http 헤더 print("content-type: text/html") # 폼파라미터읽기 form = cgi.fieldstorage() idn = form.getvalue( getvalue('id') id) pwd = form.getvalue('passwd') # 데이터베이스조회 conn = sqlite3.connect( connect('member.db db') conn.row_factory = sqlite3.row cursor = conn.cursor() cursor.execute(''' select * from meminfo where id =? ''', (idn,)) row = cursor.fetchone() if row!= None: if idn == row['id'] and pwd == row['passwd'] : # http 헤더, 헤더의끝은 n n print("location: http://localhost/surfform.html n n html n n") else: print(" n n") # http 헤더끝 print("<h2> 로그인에러!!</h2>") else: print(" n n") # http 헤더끝 print("<h2> 로그인에러!!</h2>") conn.close() 순천향대학교컴퓨터공학과이상정 20
회원가입폼페이지 회원가입폼페이지, memform.html 이름, 계정, 비밀번호입력 회원가입처리페이지 (memproc.py) 로이동 순천향대학교컴퓨터공학과이상정 21 memform.html <html> <head> <title> 회원가입 </title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <h1> 회원가입 </h1> <hr> <form method="post" action="/cgi-bin/memproc.py"> 계정 : <input name="id" type="text"> <br><br> 비번 : <input name="passwd" type="password"> <br><br> 이름 : <inputname="name" name= name type="text"> text <br><br> <input type="submit" value=" 전송 "> <br> <input type="reset" value=" 취소 "> <br> </form> </body> </html> 순천향대학교컴퓨터공학과이상정 22
회원가입처리 회원가입처리페이지, memproc.py 회원가입폼페이지의이름, 계정, 비밀번호파라미터를전달받아데이터베이스에삽입 순천향대학교컴퓨터공학과이상정 23 #!/Python34/python # import cgi import cgitb; cgitb.enable() import sqlite3 import datetime memproc.py # http 헤더 print("content-type: text/html n n") # 폼파라미터읽기 form = cgi.fieldstorage() idn = form.getvalue('id') pwd = form.getvalue('passwd') name = form.getvalue( getvalue('name') name) tm = datetime.datetime.now() # 데이터베이스삽입 conn = sqlite3.connect( connect('member.db db') cursor = conn.cursor() cursor.execute(''' insert into meminfo (id, passwd, name, time) values(?,?,?,?)''', (idn, pwd, name.encode( encode("cp949") cp949), tm)) conn.commit() conn.close() print("<h3> 회원가입이되었읍니다.</h3>"); print("<hr><p>") print("id = %s, passwd = %s, name = %s, time = %s" % (idn, pwd, 10. name, 웹과tm)) 데이터베이스연결응용 순천향대학교컴퓨터공학과이상정 24
서핑대회폼페이지 서핑대회폼페이지, surfform.html 선수조회 조회처리페이지 (surfselect.py) 로이동 선수입력 입력처리페이지 (surfinsert.py) 이동 순천향대학교컴퓨터공학과이상정 25 <html> <head> <title> 순천향서핑대회 </title> <meta http-equiv="content-type" content="text/html; text/html; charset=utf-8" /> </head> <body> <h2> 순천향서핑대회 </h2> <hr> <h3> 선수조회 </h3> <form method="post" action="/cgi-bin/surfselect.py"> 이름 : <input name="name" type="text"> <br><br> <input type="submit" value=" 조회 "> <br> </form> <hr> <h3> 선수입력 </h3> <form method="post" action="/cgi-bin/surfinsert.py"> 이름 : <input name="name" type="text"> <br><br> 점수 : <input name="score" type="text"> <br><br> 성별 : 남 <input type = "radio" name = "gender" value = "male"> 여 <input type = "radio" name = "gender" value = "female"><br><br> 국가 : <select name = "country" size="3"> <option value = "kor"> 한국 </option> <option value = "usa"> 미국 </option> <option value = "chn"> 중국 </option> <option value = "jpa"> 일본 </option> <option value = "eng"> 영국 </option> <option value = "fra"> 프랑스 </option> <option value = "aus"> 호주 </option> </select> <br><br> <input type="submit" value=" 입력 "> <br> <input type= "reset" value= " 취소 "> <br> </form> </body> </html> 순천향대학교컴퓨터공학과이상정 26 surfform.html
SQLite 브라우저다운로드설치 SQLite 데이터베이스브라우저 http://sqlitebrowser.org/ 윈도우용다운로드 sqlitebrowser-3.6.0v3-win64.exe 더블클릭하여설치 실행시 MSVCR120.dll 에러발생하면다음을다운로드설치 http://pcsx2.net/download/development/svn.html 접속 vcredist_x64.exe 다운로드설치 순천향대학교컴퓨터공학과 27 SQLite브라우저 데이터베이스, 테이블생성 (1) SQLite 브라우저를사용하여데이테베이스, 테이블생성 데이터베이스, SoonSurf.db 테이블, surfinfo name text score real gender text country text SQLite 브라우저실행 New Database -> Add field 열이름과타입지정 순천향대학교컴퓨터공학과 28
순천향대학교컴퓨터공학과 29 순천향대학교컴퓨터공학과 30
SQLite브라우저 데이터베이스, 테이블생성 (2) 순천향대학교컴퓨터공학과 31 선수입력 선수입력, surfinsert.py 선수의각항목을데이터베이스 (SoonSurf.db) 의테이블 (surfinfo) 에삽입 SQLite 브라우저에서생성한데이터베이스와테이블 순천향대학교컴퓨터공학과 32
SQLite 브라우저 삽입확인 순천향대학교컴퓨터공학과 33 컴퓨터와 #!/Python34/python 현대기술 # import cgi import cgitb; cgitb.enable() import sqlite3 surfinsert.py # http 헤더 print("content-type: type: text/html n n") # 폼파라미터읽기 form = cgi.fieldstorage() name = form.getvalue( getvalue('name') name) score = form.getvalue('score') gender = form.getvalue('gender') country = form.getvalue('country') # 데이터베이스삽입 conn = sqlite3.connect('soonsurf.db') cursor = conn.cursor() cursor.execute( execute(''' insert into surfinfo (name, score, gender, country) values(?,?,?,?)''', (name, float(score), gender, country)) conn.commit() conn.close() close() print("<h2> 선수입력 </h2>") print("<br><hr>") print("name: name %s <br>" % name) print("score: %s <br>" % score) print("gender: %s <br>" % gender) print("country: %s <br>" % country) 순천향대학교컴퓨터공학과이상정 34
선수조회 선수조회, surfselect.py 선수데이터베이스 (SoonSurf.db) 의테이블 (surfinfo) 을이름으로조회 순천향대학교컴퓨터공학과 35 컴퓨터와 #!/Python34/python 현대기술 # import cgi import cgitb; cgitb.enable() import sqlite3 surfselect.py # http 헤더 print("content-type: type: text/html n n") # 폼파라미터읽기 form = cgi.fieldstorage() name = form.getvalue( getvalue('name') name) # 데이터베이스조회 conn = sqlite3.connect('soonsurf.db') conn.row_factory = sqlite3.row cursor = conn.cursor() cursor.execute(''' select * from surfinfo where name =? ''', (name,)) row = cursor.fetchone() print("<h2> 선수조회 </h2>") print("<br><hr>") if row!= None: print("name: name: %s <br>" %row['name']) print("score: %s <br>" % row['score']) print("gender: %s <br>" % row['gender']) print("country: %s <br>" % row['country']) else: print(" 선수데이터가없습니다!!") conn.close() 순천향대학교컴퓨터공학과이상정 36
과제 앞의순천향서핑대회 CGI 프로그램을수정하여데이터베이스에저장된선수의점수순서대로정렬하여모든선수의필드 ( 열 ) 들이출력하는프로그램을작성하라. 순천향대학교컴퓨터공학과 37