ÆÄÀ̽ã(Python)À¸·Î CGI ÇÁ·Î±×·¥ ÀÛ¼ºÇϱâ

À̰­¼º

2000.1.26

Â÷·Ê

¿©±â »ç¿ëµÈ ¼Ò½º¸¦ ´Ù¿î ¹ÞÀ¸·Á¸é ¿©±â(WinZip ÆÄÀÏ) ¶Ç´Â ¿©±â(tar.gz ÆÄÀÏ)¸¦ Ŭ¸¯Çϼ¼¿ä!!!

 

¿Ö ÆÄÀ̽ãÀ¸·Î CGIÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß Çϴ°¡?

¸ÕÀú, ÆÄÀ̽ã(Python)Àº ¹ü¿ë ¾ð¾î¶ó´Â °ÍÀ» ¸»Çؾ߰ڴÙ. ÆÄÀ̽ãÀº ´ëºÎºÐÀÇ À¥ ÇÁ·Î±×·¡¹Ö¿¡ Àû´çÇÏÁö¸¸, ´ÜÁö ¸î °³ÀÇ SSI(Server Side Include) ÆäÀÌÁö°¡ ÇÊ¿äÇÏ´Ù¸é PHP¿Í °°Àº ¾ð¾î°¡ ´õ Àû´çÇÒ °ÍÀÌ´Ù.

PerlÀº CGIÀÇ '¿Õ'À¸·Î ¾Ë·ÁÁ®ÀÖ´Ù. PerlÀº ÅØ½ºÆ® ½ºÄ³´×°ú ÇÁ·Î¼¼½Ì¿¡ Àß ¸Â´Â ¾ð¾îÀ̰í, È®ÀåµÈ CGI ¸ðµâÀº Àß ¼³°èµÇ¾ú´Ù. ÇÏÁö¸¸, Àü¹®ÀûÀÎ Perl ÇÁ·Î±×·¡¸Ó¸¦ Á¦¿ÜÇϰí´Â PerlÀ» ÀÌ¿ëÇÏ¿© ºü¸¥ ¾îÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϱâ¶õ º¸ÅëÀÇ ÇÁ·Î±×·¡¸Ó·Î´Â »ý°¢ÇÏ±â ¾î·Æ´Ù. ÆÞÀÇ ÀâÀ½ °°Àº ¹®¹ý°ú '¾î¶² ÀÏÀ» ¼öÇàÇϴµ¥´Â ÇѰ¡Áö ÀÌ»óÀÇ ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù'¶ó´Â öÇÐÀº °ü¸®Çϱ⠾î·Á¿î º¹ÀâÇÑ Äڵ带 ¸¸µé¾î ³½´Ù.

±¦Âú°í °­·ÂÇÑ ÇÁ·Î±×·¥ÀÌ ÆÞ·Î ¾²¿©Áú ¼ö ¾ø´Ù°í À̾߱âÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ¶§¶§·Î ´Ù¸¥ »ç¶÷ÀÇ º¹ÀâÇÑ Äڵ带 ÀÌÇØÇϱâ À§Çؼ­ ¾ð¾î ÀÚü¿¡ °üÇÑ Áö½ÄÀÌ ÇÊ¿äÇÏ´Ù. ¸¸ÀÏ ¿©·¯ºÐÀÌ Ã³À½ºÎÅÍ À¥ ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇÏ·Á ÇÑ´Ù¸é ÆÄÀ̽ãÀ» ÁøÁöÇÏ°Ô °í·ÁÇØºÁ¾Æ¾ß ÇÒ °ÍÀÌ´Ù. '±× ÀÏÀ» Çϱ⿡´Â ¹Ù·Î ÀÌ·± ¹æ¹ýÀÌ Á¸ÀçÇØ!' ¿Í °°ÀÌ ¸í¹éÇÑ ¹æ¹ý·ÐÀ» Á¦°øÇÏ´Â ÆÄÀ̽ãÀ» ¸»ÀÌ´Ù.

ÆÄÀ̽ãÀº ´Ù¸¥ ¾î¶² ¾ð¾îº¸´Ùµµ ´õ ±ò²ûÇÑ ¹®¹ýÀ» °®´Â´Ù. ¶ÇÇÑ, ÆÄÀ̽ã ÀÚü°¡ °´Ã¼ÁöÇâÀ» À§Çؼ­ ¸¸µé¾î Á³´Ù. ÇÏÁö¸¸ Ŭ·¡½º¸¦ »ç¿ëÇ졂 ¸»°Ç ±×°ÍÀº »ç¿ëÀÚ¿¡ ´Þ·È´Ù. Ŭ·¡½º¸¦ »ç¿ëÇÏÁö ¾Ê´õ¶óµµ ¸ðµâ´ÜÀ§ÀÇ °´Ã¼ °³³äÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÆÄÀ̽ãÀº ±ò²ûÇϰí, Àбâ ÁÁÀº ±¸¹® ±¸Á¶´Â ÀÌ ¾ð¾î¸¦ ¹è¿ì´Â »ç¶÷µé¿¡°Ô 'Ãູ'À̶ó°í±îÁö ÇÒ ¼ö ÀÖ´Ù.

¾ÆÆÄÄ¡ ¼­¹ö¿¡¼­ ÇÁ·Î±×·¥À» °³¹ßÇÏ´Â »ç¶÷µéÀº mod_python À̳ª pyApache ¸ðµâÀÌ ¾ÆÆÄÄ¡ ¾È¿¡ ¼û°ÜÁ®¼­ ÆÞ ÇÁ·Î±×·¥ÀÇ ¼öÇà¼Óµµ¿Í °ßÁÙ Á¤µµ°¡ µÇ´Â °Í¿¡ ³î¶ö °ÍÀÌ´Ù.

ÃÖ±Ù¿¡ ÆÄÀ̽ãÀº ¸Å¿ì È®ÀåÀûÀ̰í, Àß Á¤¸®µÈ ´Ù¾çÇÑ À¯¿ëÇÑ Æ÷ÅÍºí ¶óÀ̺귯¸®¸¦ °®´Â ¸ðµâÀÌ °³¹ßµÇ¾î¿Ô´Ù. ÀÎÅÍ³Ý °ü·Ã ¸ðµâÀº »ó´çÈ÷ Èï¹ÌÀ־, ÆÄ½Ì, URL°Ë»öºÎÅÍ POP¼­¹ö·ÎºÎÅÍ ¸ÞÀÏÀ» °¡Á® ¿À´Â °Í±îÁö, ±×¸®°í ±× »çÀÌÀÇ ¸ðµç ±â´ÉÀÌ ÀÖ´Ù. GUIºÎÅÍ µ¥ÀÌÅͺ£À̽º±îÁö ´Ù·ç´Â ¶Ç ´Ù¸¥ ¸ðµâµéµµ Á¸ÀçÇÑ´Ù.

 

ù ¹øÂ° CGI ÇÁ·Î±×·¥

¿©±â¼­ ¿ì¼±, ¿©·¯ºÐÀÌ ÆÄÀ̽㠽ÇÇà ȯ°æÀ» °®Ãß°í ÀÖ°í À¥¼­¹ö°¡ ÁغñµÇ¾îÀÖ´Ù°í °¡Á¤ÇϰڴÙ. (±×·¸Áö ¾ÊÀ¸¸é ´õ ÁøÇàÇÒ ¼ö ¾ø´Ù.)  ¸ÕÀú ¼³¸íÇØ¾ß ÇÒ °ÍÀº ¿©·¯ºÐÀÌ ¾ÆÆÄÄ¡ ¼­¹ö¸¦ »ç¿ëÇϰí ÀÖ´Ù¸é mod_python ȤÀº pyApache¸¦ »ç¿ëÇϱ⠹ٶõ´Ù( http://www.modpython.org/, http://www.bel-epa.com/pyapache/ ) ±× ¸ðµâÀº ÀÎÅÍÇÁ¸®Å͸¦ ½ÃÀÛÇϰí, ¿¬°áÀ» ¼³Á¤ÇÏ´Â ½Ã°£À» Àý¾àÇØ ÁÙ °ÍÀÌ´Ù.

¿©·¯ºÐÀÌ À¯´Ð½º¿¡¼­ ¾ÆÆÄÄ¡ ¼­¹ö¸¦ »ç¿ëÇϰí ÀÖ´Ù¸é, CGI°¡ ±âº»ÀûÀ¸·Î À§Ä¡ÇØ¾ß ÇÒ µð·ºÅ丮´Â

      user_home/public_html/cgi-bin  (¿¹: /home/gslee/public_html/cgi-bin)

À̰ųª ±× ¼­ºêµð·ºÅ丮ÀÏ °ÍÀÌ´Ù. user_homeÀº ¿©·¯ºÐÀÇ È¨ µð·ºÅ丮ÀÌ´Ù. (½Ã½ºÅÛ ¼³Á¤¿¡ µû¶ó ´Þ¶óÁö´Ï È®ÀÎÇØ º¸¾Æ¾ß ÇÑ´Ù.) ´ÙÀ½¿¡ ¿©·¯ºÐÀÌ ÀÛ¼ºÇÒ Ã¹ ¹øÂ° CGI ÇÁ·Î±×·¥À» º¸ÀδÙ. ÆÄÀϸíÀº hello.py¶ó ÇÏÀÚ. ¾Æ¹« ÅØ½ºÆ® ÆíÁý±â¸¦ »ç¿ëÇÏ¿© ´ÙÀ½ ÆÄÀÏÀ» ¸¸µç´Ù.


#!/usr/bin/python   # Tell the browser how to render the text print "Content-Type: text/plain\n\n"   print "Hello, Python!" # print a test string

Linux/Unix¸¦ ¾²°í ÀÖ´Ù¸é ÆÄÀÏÀ» ¸¸µé°í ³­ ÈÄ ¹Ýµå½Ã chmod +x hello.py¸¦ ÇÏ¿© ½ÇÇà¸ðµå¸¦ ÁÖ´Â °ÍÀ» ÀØÁö ¸»ÀÚ!!! ù ¹øÂ° ¶óÀÎ

#!/usr/bin/python

Àº Linux/Unix ½Ã½ºÅÛ¿¡¸¸ ÇÊ¿äÇÏÁö¸¸, ´Ù¸¥ ¿î¿µÃ¼Á¦¿¡¼­´Â ¹®Á¦¸¦ ÀÏÀ¸Å°Áö ¾Ê´Â´Ù. ÆÄÀ̽ã ÀÎÅÍÇÁ¸®Å͸¦ ÀÚµ¿ÀûÀ¸·Î È£ÃâÇϱâ À§ÇÑ °æ·Î¸íÀÌ´Ù. µû¶ó¼­ ÀÌ °æ·Î¸íÀº Á¤È®ÇØ¾ß ÇÑ´Ù. /usr/local/bin/python ÀÎ °Ï¿ìµµ ÀÖ´Ù. À©µµ¿ìÁ ¸ÅŲÅä½Ã¿¡¼­´Â ÆÄÀÌ½ã ÆÄÀÏÀ» ½ÇÇàÇϵµ·Ï ´Ù¸¥ ÀýÂ÷¸¦ °ÅÃÄ¾ß ÇÑ´Ù. ù ¹øÂ° ¹®ÀÚ°¡ #À̶ó¸é ÁÖ¼®(comment)¹®ÀÌ´Ù.

# Tell the browser how to render the text

ÀÌ°Í ¿ª½Ã ÁÖ¼®(comment)¹®ÀÌ´Ù.

print "Content-Type: text/plain\n\n"

Ç¥ÁØ Ãâ·ÂÀ¸·Î Content-Type: text/plain ¿Í µÎ °³ÀÇ new-lineÄڵ带 Ãâ·ÂÇÑ´Ù. Ç¥ÁØ Ãâ·ÂÀº ¼­¹ö¸¦ ÅëÇØ¼­ Ŭ¶óÀ̾ðÆ®(À¥ºê¶ó¿ìÀú)·Î Àü´ÞµÈ´Ù. ÀÌ Ã¹ ¹øÂ° Ãâ·Â ³»¿ëÀº ¾î¶² Çü½ÄÀ¸·Î ¹®¼­°¡ ±¸¼ºµÇ¾î ÀÖ´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù. text/plainÀº ÀÏ¹Ý ÅØ½ºÆ® ¹®¼­ÀÓÀ» ³ªÅ¸³½´Ù. ³ªÁß¿¡ text/html ¹®¼­¸¦ º¸³»´Â ¹æ¹ýÀ» ¹è¿ï °ÍÀÌ´Ù. \nÀº ÁÙ ¹Ù²Ù±â ŰÀÎ EnterŰ Äڵ忡 ÇØ´çÇÑ´Ù. À̰ÍÀº CGI ¹®¼­ ±³È¯¿¡ À־ Ç¥ÁØÀÌ´Ù. µÎ °³ÀÇ new lineÀÌ ÇÊ¿äÇÏ´Ù.

print "Hello, Python!"  # print a test string

ÀÌ ¹®Àº ´Ü¼øÈ÷ Hello, Python!À» Ãâ·ÂÇÑ´Ù. ÀÌ Ãâ·ÂÀº È­¸éÀÌ ¾Æ´Ñ À¥ ºê¶ó¿ìÀú·Î Àü´ÞµÈ´Ù.

ÀÚ, ÀÌÁ¦ À¥ ºê¶ó¿ìÀú¿¡¼­ ÀÌ CGI ¸ðµâÀ» È£ÃâÇØ º¸ÀÚ. hello.py°¡ gslee/public_html/cgi-bin ¿¡ ÀúÀåµÇ¾î ÀÖ°í, ¾ÆÆÄÄ¡ ¼­¹ö°¡ cgiwrapÀ» ÀÌ¿ëÇÏ¿© °³ÀÎ »ç¿ëÀÚ(gslee)¿¡°Ô cgi ¾²±â¸¦ Çã¿ëÇÑ´Ù¸é,

http://sr.kwangwoon.ac.kr/cgi-bin/cgiwrap/~gslee/hello.py

¿Í °°ÀÌ È£ÃâÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ ·çÆ®ÀÇ ±ÇÇÑÀÌ À־ /home/httpd/cgi-bin¿¡ hello.py¸¦ ÀúÀåÇÑ´Ù¸é, ´ÙÀ½°ú °°ÀÌ È£ÃâÇÑ´Ù.

http://sr.kwangwoon.ac.kr/cgi-bin/cgiwrap/~gslee/hello.py

È­¸é¿¡ "Hello Python!"ÀÌ ³ª¿Â´Ù¸é ¼º°ø!!!!

 

Æû ÅÂ±×¿Í ¿¬°áÇϱâ

¾Õ ¿¹´Â CGIÀÇ µ¿ÀÛÀ» º¸¿©ÁÖ´Â ½Ç¿ëÀûÀÎ ¿¹·Î¼­´Â ÃæºÐÇÏÁö ¾Ê´Ù. ¿©±â¼­´Â °£´ÜÇÑ ½ÇÁ¦ÀÇ CGI ÇÁ·Î±×·¥ ¿¹¸¦ º¸¿©ÁØ´Ù. ÆÄÀ̽㿡 ´ëÇØ¼­ Àß ¸ð¸£¸é ¼³¸í¼­ À©µµ¿ì¸¦ ¿Ã·Á³õ°í ÇÔ²² Âü°íÇÏ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÏ °ÍÀÌ´Ù.

¸ÕÀú ¾Ë¾Æ¾ß ÇÒ °ÍÀº, ¾î¶»°Ô HTML ¹®¼­ÀÇ Æû ű׷κÎÅÍ Á¤º¸¸¦ ¾ò¾î ¿À´Â °¡ÀÌ´Ù. ÆÄÀ̽ãÀº À̸¦ À§ÇÑ ÈÇ·ÉÇÑ ¸ðµâÀ» Á¦°øÇÑ´Ù. ±× ¸ðµâÀ̸§Àº ¿ì¿¬ÇϰԵµ cgiÀÌ´Ù(^^).  ¿¹¸¦ º¸ÀÚ.

HTML Æû¿¡ ÀÖ´Â µ¥ÀÌÅÍ´Â input ¿ä¼ÒÀÇ À̸§À¸·Î ÂüÁ¶µÈ´Ù. ¿¹¸¦ µé¾î <INPUT TYPE=TEXT NAME=email SIZE=40> ´Â emailÀ̶õ À̸§ÀÇ 40ÀÚ ÆøÀÇ ÅØ½ºÆ® ¹Ú½º¸¦ ¸¸µé¾î³½´Ù.

ÀÌ Á¤º¸´Â CGI·Î GETÀ̳ª POST ¹æ¹ýÀ¸·Î Àü´ÞµÈ´Ù. ÇÏÁö¸¸ ½Å°æ¾µ °Í ¾ø´Ù. cgi ¸ðµâÀº ÀÌ ¹æ¹ýÀÇ Â÷À̸¦ ¿©·¯ºÐÀ¸·ÎºÎÅÍ ¼û±â¸ç, ÆÄÀ̽ãÀÇ ±âº» µ¥ÀÌÅÍÇü-»çÀü-À¸·Î °ªÀ» Àü´ÞÇÑ´Ù. »çÀüÀº ¼ýÀÚ°¡ ¾Æ´Ñ ³»¿ëÀ¸·Î ÂüÁ¶µÇ´Â ¹è¿­°ú À¯»çÇÏ´Ù. ÆÄÀ̽ã cgi¸ðµâÀº FieldStorage¶ó ºÒ¸®´Â ¸Þ½áµå¸¦ Á¦°øÇÑ´Ù. ÀÌ ¸Þ½áµå´Â ¸ðµç Æû <INPUT>°ú ±×¿¡ ´ëÀÀÇÏ´Â °ªÀ» ÀúÀåÇÑ »çÀüÀ» ¸®ÅÏÇÑ´Ù. ¿øÇÏ´Â INPUT ¿ä¼ÒÀÇ À̸§À» ¾Ë¸é ´ÙÀ½°ú °°ÀÌ ½±°Ô °ªÀ» ¾òÀ» ¼ö ÀÖ´Ù.


import cgi The_Form = cgi.FieldStorage() print The_Form["email"].value
     
    The_Form = cgi.FieldStorage() 

´Â ÆûÀÇ input À̸§°ú °ªÀ» ÀúÀåÇÑ »çÀüÀ» µ¹·ÁÁÖ°í,

    print The_Form["email"].value 

´Â 'email' ű×ÀÇ °ªÀ» Ãâ·ÂÇÑ´Ù. ¹°·Ð

    email = The_Form['email'].value 

¿Í °°ÀÌ °ªÀ» º¯¼ö¿¡ ÀúÀåÇÒ ¼öµµ ÀÖ´Ù. ¸¸ÀÏ Æû ű׷Π³Ñ¾î¿À´Â Àüü º¯¼öÀ̸§µéÀ» ¾Ë°í ½ÍÀ¸¸é

    print The_Form.keys()

°ªµé ¸ñ·ÏÀ» º¸°í ½ÍÀ¸¸é

    print The_Form.values()

ÇÑ´Ù. ´ÜÁö À§ÀÇ ¼ø¼­´Â º¸ÀåÀÌ ¾ÈµÈ´Ù´Â °ÍÀ» ¸í½ÉÇÏÀÚ. ¸¸ÀÏ Á¤ÀǵÇÁö ¾ÊÀº ȤÀº °ªÀÌ ¾ø´Â Çʵ带 ¾ò°íÀÚ ÇÏ¸é ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. ¸¸ÀÏ À̰ÍÀ» ¿©·¯ºÐÀÌ Ã³¸®ÇÏÁö ¾ÊÀ¸¸é ½ºÅ©¸³Æ®´Â ÁߴܵȴÙ. ±×·¡¼­ "Internal Server Error"¸¦ º¸°Ô µÉ °ÍÀÌ´Ù. ¿¹¿Üó¸®ÀÇ ÀÚ¼¼ÇÑ ³»¿ëÀº ÆÄÀ̽㠸Ŵº¾óÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù. °£´ÜÈ÷ ó¸®ÇÏ´Â ¿¹¸¦ ¿©±â¼­ º¸ÀÌ¸é ´ÙÀ½°ú °°´Ù.


import cgi The_Form = cgi.FieldStorage() try:
    email = The_Form["email"].value
except (KeyError, TypeError):
    email = ''
print email

Á¾ÇÕÇØ¼­ °£´ÜÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸ÀÚ. HTML ÆûÀÌ Á¦°øÇÏ´Â ¸ðµç º¯¼ö¸¦ Ãâ·ÂÇÏ´Â ¿¹¸¦ ÀÛ¼ºÇØ º¸ÀÚ. (prfield.py)


#!/usr/bin/python   import cgi   print "Content-Type: text/plain\n\n"   The_Form = cgi.FieldStorage()   for name in The_Form.keys(): print "Input: " + name + " value: " + The_Form[name].value + "
"   print "Finished!"

 º¸´Â ¹Ù¿Í °°ÀÌ, ÀÌ ÇÁ·Î±×·¥Àº HTML Æû¿¡¼­ Á¦°øÇÏ´Â ¸ðµç º¯¼öÀÇ °ªÀ» Ãâ·ÂÇÑ´Ù.

for name in The_Form.keys():

´Â ¸ðµç º¯¼öÀÇ À̸§¿¡ ´ëÇØ¼­ ¹Ýº¹ÇÏ´Â Á¦¾î¹®À̰í, °¢ º¯¼öÀ̸§¿¡ ´ëÇÏ¿© ´ÙÀ½ ¹®À» ¼öÇàÇÑ´Ù.

    print "Input: " + name + " value: " + The_Form[name].value + "

¿©±â¼­ nameÀº º¯¼ö¸íÀÌ µÇ°í, The_Form[name].value´Â ±×¿¡ ÇØ´çÇÏ´Â °ªÀÌ´Ù. ¹®ÀÚ¿­¿¡ À־ '+' ¿¬»êÀº µÎ °³ÀÇ ¹®ÀÚ¿­À» ºÙÀδÙ.

HTML ¹®¼­¿¡´Â ´ÙÀ½°ú °°Àº ÆûÀ» ¸¸µé ¼ö ÀÖ´Ù. (http://sr.kwangwoon.ac.kr/~gslee/prfield.html)

    <form name="form" method="get" action="http://sr.kwangwoon.ac.kr/cgi-bin/cgiwrap/~gslee/prfield.py">
    <p>
    email:<input type="text" name="email">
    name:<input type="text" name="name">
    <input type="submit" value="½ÇÇà">
    </p>
    </form>

Æû ű׿¡¼­ action="http://sr.kwangwoon.ac.kr/cgi-bin/cgiwrap/~gslee/prfield.py" ´Â È£ÃâÇÒ cgi ÇÁ·Î±×·¥ÀÇ URLÀ» ±â¼úÇÑ´Ù.

 

Display ÇÔ¼ö¸¦ Á¤ÀÇÇÏÀÚ

¾ÕÀÇ ¿¹¸¦ ºÁ¼­ ¾Ë°ÚÁö¸¸, CGI¶õ »ý¼ºµÈ Á¤º¸¸¦ °®´Â »õ·Î¿î ¹®¼­¸¦ ¸¸µé¾î ÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. Á¤º¸¸¦ »ý¼ºÇÏ´Â °ÍÀº ÀÀ¿ë¿¡ µû¶ó¼­ ½¬¿ï ¼öµµ ÀÖ°í ¾î·Á¿ï ¼öµµ ÀÖ´Ù. ±× °ÍÀº ÀÏ¹Ý ÇÁ·Î±×·¡¹Ö°ú ´Ù¸£Áö ¾Ê´Ù. ±×·¯³ª ¾î¶°ÇÑ °æ¿ì¿¡³ª ¹®¼­¸¦ Á» ´õ ¸ÚÁö°Ô º¸À̱â À§Çؼ­´Â HTML ¹®¼­ Çü½ÄÀ¸·Î Ãâ·ÂÇØ¾ß Çϴµ¥, ÀÌ °ÍÀ» CGIÇÁ·Î±×·¥»ó¿¡¼­ Çϱ⿡´Â Á» ¹ø°Å·Ó´Ù. ¹°·Ð ¸¹Àº °æ¿ì ±×·¸°Ô Çϱ⵵ ÇÏÁö¸¸, ÇÁ·Î±×·¥ÀÌ Ä¿Áú¼ö·Ï °ü¸®ÇϱⰡ Á¡Á¡ ´õ ¾î·Á¿öÁø´Ù. °¡Àå ÁÁÀº ÇØ°á ¹æ¹ýÀº HTML¹®¼­ÀÇ Æ²Àº HTML ¹®¼­ ÆíÁý±â·Î ÆíÁýÇÑ´Ù(µðÀÚÀÎ). ±×¸®°í ±× Ʋ ¾ÈÀÇ ¿øÇÏ´Â À§Ä¡¿¡ CGI¿¡¼­ »ý»êµÈ Á¤º¸¸¦ ¹èÄ¡½ÃŰ¸é µðÀÚÀΰú ÇÁ·Î±×·¥ ÀÛ¾÷À» ºÐ¸®ÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ. ½ÇÁ¦ÀûÀÎ HTML¹®¼­´Â ÀÌ°Í º¸´Ù´Â ÈξÀ ´õ º¹ÀâÇϰÚÁö¸¸ ±âº»ÀûÀÎ ¾ÆÀ̵ð¾î¸¦ ¼³¸íÇϱâ À§ÇÏ¿© °¡Àå °£´ÜÇÑ ¹®¼­¸¦ ¸¸µé¾ú´Ù.

    template.html
    
    <html>   <head>     <META NAME="keywords" CONTENT="blah blah -- your ad here">     <title>Python is Fun!</title>   </head>   <body>                 <!-- *** INSERT CONTENT HERE *** -->   </body> </html>


¹®¼­Áß¿¡ <!-- *** INSERT CONTENT HERE *** --> ºÎºÐÀº CGI¿¡¼­ »ý¼ºµÈ Á¤º¸·Î ´ëÄ¡µÉ ºÎºÐÀÌ´Ù. ÆÄÀ̽ã ÇÁ·Î±×·¥Àº ÀÌ ºÎºÐÀ» ã¾Æ¼­ ´Ù¸¥ ¹®ÀÚ¿­·Î ´ëÄ¡ÇÑ´Ù. À̰ÍÀ» ¼öÇàÇϱâ À§Çؼ­ ÇÑ ¹®ÀÚ¿­À» ´Ù¸¥ ¹®ÀÚ¿­·Î ´ëÄ¡ÇÏ´Â ¹æ¹ýÀÌ ÇÊ¿äÇÏ´Ù. Á¤±Ô½Ä(Regular Expression:RE)À¸·Î À̰ÍÀÌ °¡´ÉÇÏ´Ù. ÆÄÀ̽ãÀÇ PE´Â ÆÞÀÇ °Í°ú °ÅÀÇ µ¿ÀÏÇÏ´Ù. ÇÏÁö¸¸ À̰ÍÀÌ ¾ð¾îÀÇ ÀϺηΠ¼³°èµÈ °ÍÀº ¾Æ´Ï°í ¸ðµâ(re)·Î¼­ Á¦°øµÈ´Ù. Á¤±Ô½Ä¿¡ ´ëÇØ¼­ ´õ ¾Ë°í ½ÍÀ¸¸é  the Regular Expression HOWTO¸¦ Âü°íÇϱ⠹ٶõ´Ù.

¸ðµâ re´Â subn ÇÔ¼ö¸¦ Á¦°øÇϴµ¥ Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

    subn (pattern, repl, string) 

string¿¡¼­ patternÀ» ã¾Æ¼­ repl·Î ¹Ù²Û´Ù. ¿¹¸¦ µé¸é ´ÙÀ½ÀÇ ¿¹´Â

    res = re.subn('abcd', 'xyz', 'abcdefghi')
    print res
    ('xyzefghi', 1)  

ÀÇ Ãâ·ÂÀ» ³½´Ù. 'abcd'¸¦ ã¾Æ¼­ 'xyz'·Î ¹Ù²Û´Ù. Ãâ·ÂÀº ÅÍÇÃÀε¥ ù ¹øÂ° °ªÀº ġȯµÈ ½ºÆ®¸µ, µÎ ¹øÂ°´Â ¼º°øÇßÀ¸¸é 1, ½ÇÆÐÇßÀ¸¸é 0ÀÌ´Ù. µû¶ó¼­ res[0] Àº 'xyzefghi'À̰í res[1]Àº 1ÀÌ´Ù.

Display() ÇÔ¼ö´Â ÇϳªÀÇ Àμö(Content)¸¦ ¹Þ´Âµ¥ ÀÌ °ÍÀº <!-- *** INSERT CONTENT HERE *** --> À§Ä¡¿¡ µé¾î°¥ ¹®ÀÚ¿­ÀÌ´Ù.

ÀÚ ÀÌÁ¦ ÇÔ¼ö Display¸¦ ¸¸µé ¸ðµç Áغñ´Â µÆ´Ù.


import re  # Á¤±Ô½Ä ¸ðµâ »ç¿ëÇÒ ¼ö ÀÖ°Ô import ÇÑ´Ù
 
# Ʋ ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù
TemplateFile = "template.html"
 
# Display ÇÔ¼ö Á¤ÀÇ
# ÇϳªÀÇ Àμö¸¦ ¹ÞÀ½ - Ç¥½ÃÇÒ ¹®ÀÚ¿­ÀÓ
def Display(Content):
    fp = open(TemplateFile, "r")  # ÆÄÀÏÀ» Àбâ¸ðµå·Î ¿¬´Ù
    # Àüü ÆÄÀÏÀ» ÀÐ¾î µéÀδÙ
    TemplateInput = fp.read()     
    fp.close()                    # ÆÄÀÏÀ» ´Ý´Â´Ù
 
    # Ʋ ÆÄÀÏÀÌ ¸Á°¡Á®¼­ ¿¹¿Ü°¡ ¹ß»ýÇßÀ» ¶§ Ãâ·ÂÇÒ ¿¹¿Ü ¹®ÀÚ¿­À» Á¤ÀÇ
    BadTemplateException = "Ʋ ÆÄÀÏ¿¡ ¹®Á¦°¡ »ý°å¾î¿ä!"
 
    SubResult = re.subn("<!-- *** INSERT CONTENT HERE *** -->",  
        Content,TemplateInput)
    if SubResult[1] == 0:
        raise BadTemplateException  # ¿¹¿Ü¸¦ ¹ß»ý½ÃŲ´Ù
 
    print "Content-Type: text/html\n\n"
    print SubResult[0]

BadTemplateExceptionÀº Ʋ ÆÄÀÏÀÌ ¸Á°¡Á³À» ¶§ ¿¹¿Ü¸¦ ¹ß»ý½Ã۱â À§Çؼ­ Á¤ÀǵǾú´Ù. ¸¸ÀÏ Æ² ÆÄÀÏ¿¡¼­ ÁÖ¼®À» ¹ß°ßÇÒ ¼ö ¾øÀ» ¶§´Â Ä¡¸íÀûÀÎ ¿¡·¯¸¦ ¹ß»ý½Ã۰í ÇÁ·Î±×·¥À» Áß´ÜÇÑ´Ù. ¶ÇÇÑ ÇÁ·Î±×·¥ÀÌ ´Ü¼øÈ÷ Ʋ ÆÄÀÏÀ» open ÇÒ ¼ö ¾øÀ» ¶§¿¡µµ (unhandled, fatal) ¿¹¿Ü¸¦ ¹ß»ý½ÃŲ´Ù.

 ¾Õ¼­ ¼³¸íÇßµíÀÌ ´ÙÀ½ ¹®Àº Ʋ ÆÄÀÏ ÅØ½ºÆ®(TemplateInput) ÀÇ <!-- *** INSERT CONTENT HERE *** -->¸¦ Content º¯¼ö¿¡ ÀúÀåµÈ ¹®ÀÚ¿­·Î ¹Ù²Û´Ù.

    SubResult = re.subn("<!-- *** INSERT CONTENT HERE *** -->",  
        Content,TemplateInput)

subn ÇÔ¼ö´Â ÅÍÇÃÀ» µ¹·ÁÁִµ¥ ù ¹øÂ° °ªÀº ġȯµÈ ¹®ÀÚ¿­ÀÌ°í µÎ ¹øÂ°´Â Á¤¼ö°ªÀ¸·Î ¼º°øÇßÀ¸¸é 1, ½ÇÆÐÇßÀ¸¸é 0ÀÇ °ªÀ» °®´Â´Ù.

¿©·¯ºÐÀº ÀÌÁ¦ ÀÚ½ÅÀÇ CGI ÇÁ·Î±×·¥¿¡¼­ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Ãâ·ÂÇÒ ¿ÏÀüÇÑ ¹®ÀÚ¿­ÀÌ ÁغñµÇ¸é DisplayÇÔ¼ö¸¦ ºÒ·¯¶ó.

 

ÆûÀ» »ý¼ºÇÏ°í ÆûÀ» ó¸®ÇÏ´Â ÇϳªÀÇ CGI¸¦ ¸¸µéÀÚ

 ¾Õ¼­ÀÇ ¿¹¿¡¼­´Â ÆûÀ» »ý¼ºÇÏ´Â HTML¹®¼­¿Í ÆûÀ» ó¸®ÇÏ´Â CGI ÇÁ·Î±×·¥ÀÌ º°µµ·Î ÀÛ¼ºµÇ¾ú´Ù. ¿©±â¿¡¼­´Â ÇϳªÀÇ CGI ÇÁ·Î±×·¥ÀÌ ÆûÀ» »ý¼ºÇϰí, »ý¼ºµÈ Æû¿¡¼­ ¿ä±¸ÇÏ´Â ³»¿ëÀ» ó¸®ÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏÀÚ. ¸ÕÀú, »ç¿ëµÉ ÆûÀ» ´ÙÀ½¿¡ º¸ÀδÙ.

form.html

<form method="post" action="sample1.py"> <INPUT TYPE=HIDDEN NAME="key" VALUE="process"> Your name:<br> <input type="text" name="name" size="60"> <br> Email: (optional)<br> <input type="text" name="email" size="60"> <br> Favorite Color:<br> <input type="radio" name="color" value="blue" checked>Blue <input type="radio" name="color" value="yellow">No, Yellow... <input type="radio" name="color" value="swallow">What do you mean, an African or European swallow? <p> Comments:<br> <textarea name="comment" rows="8" cols="60"> </textarea> <p> <input type="submit" value="Okay"> </form>

 Àüü ÇÁ·Î±×·¥Àº ´ÙÀ½¿¡ º¸ÀδÙ.

sample1.py:

#!/usr/bin/python   import re import cgi   # Ʋ ÆÄÀÏ À̸§ TemplateFile = "template.html"   # »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÙ Æû ÆÄÀÏ À̸§ FormFile = "form.html"   # Display ÇÔ¼ö. Ãâ·ÂÇÒ ¹®ÀÚ¿­ÀÎ ÇϳªÀÇ Àμö¸¦ ¹Þ´Â´Ù. def Display(Content): TemplateHandle = open(TemplateFile, "r")  # ÆÄÀÏ Àбâ¸ðµå·Î ¿ÀÇ # Àüü ÆÄÀÏÀ» Àд´٠TemplateInput = TemplateHandle.read() TemplateHandle.close()                    # ÆÄÀÏ Å¬·Î¿ìÁî # Ʋ ÆÄÀÏÀÌ À߸ø µÇ¾úÀ» ¶§ÀÇ ¿¹¿Ü Á¤ÀÇ BadTemplateException = "HTML Ʋ ÆÄÀÏ¿¡ ¹®Á¦°¡ »ý°å¾î¿ä~"   SubResult = re.subn("<!-- *** INSERT CONTENT HERE *** -->", Content,TemplateInput) if SubResult[1] == 0:
    raise BadTemplateException print "Content-Type: text/html\n\n" print SubResult[0]   ### ƲÀ» º¸¿©ÁÖ°í, ±× °ÍÀ» ó¸®ÇÏ´Â µÎ °³ÀÇ ¸ÅÀÎ Çൿ ÇÔ¼ö Á¤ÀÇ   # °£´ÜÇÑ ÇÔ¼öÀÓ. def DisplayForm():
FormHandle = open(FormFile, "r")
FormInput = FormHandle.read()
FormHandle.close()      Display(FormInput)   def ProcessForm(form):    
# Æû¿¡¼­ Á¤º¸¸¦ ½±°Ô ÃßÃâ.. try: name = form["name"].value except:
    # name ÀÌ Á¤ÀǾȵǾúÀ¸¸é ¸Þ½ÃÁö Ãâ·ÂÇϰí Á¾·á         Display("À̸§Àº ÀÔ·ÂÇÏ¼Å¾ß ÇÕ´Ï´Ù. µÇµ¹¾Æ°¡ ÁÖ¼¼¿ä")         raise SystemExit     try:         email = form["email"].value     except:         email = None     try:         color = form["color"].value     except:         color = None     try:         comment = form["comment"].value     except:         comment = None   Output = ""  # Ãâ·Â ¹öÆÛ ÃʱâÈ­ Output = Output + "Hello, "        if email != None:     Output = Output + "<A HREF="mailto:" + email + "">" +  name + "</A>.<P>"     else:         Output = Output + name + ".<P>"        if color == "swallow":         Output = Output + "You must be a Monty Python fan.<P>"     elif color != None:         Output = Output + "Your favorite color was " + color + "<P>"     else:         Output = Output + "You cheated!  You didn't specify a color!<P>"      if comment != None:         Output = Output + "In addition, you said:<BR>" + comment + "<P>"        Display(Output)   ### ### ½ÇÁ¦ ½ºÅ©¸³Æ® ¿©±â¼­ ½ÃÀÛ ###   ### CGI ¿ä±¸ Æò°¡ form = cgi.FieldStorage()   ### "key" ´Â Æû¿¡¼­ ¼û°ÜÁø ¿ä¼ÒÀÓ. try:     key = form["key"].value except:     key = None if key == "process":     ProcessForm(form) else:     DisplayForm()

Display ÇÔ¼ö´Â ¾Õ¼­ ¼³¸íÇßÀ¸¹Ç·Î ³Ñ¾î°¡±â·Î ÇÏÀÚ.  ÆÄÀ̽ãÀº µ¿Àû ÇØ¼® ¾ð¾îÀ̹ǷΠÇÔ¼ö´Â »ç¿ëµÇ±â Àü¿¡ ¸ÕÀú Á¤ÀǵǾî¾ß ÇÑ´Ù.

DisplayForm() ÇÔ¼ö´Â form.htmlÀ» Ãâ·ÂÇÏ´Â ÇÔ¼öÀÌ´Ù. Áï, »ç¿ëÀÚ¿¡°Ô ÀÔ·ÂÀ» ¿ä±¸ÇÏ´Â ¹®¼­¸¦ Á¦°øÇÑ´Ù.

ProcessForm() ÇÔ¼ö´Â DisplayForm()ÇÔ¼ö¿¡ ÀÇÇØ¼­ Ãâ·ÂµÈ ÆûÀ¸·Î »ç¿ëÀÚ°¡ ¿ä±¸¸¦ Á¦Ãâ(submit)ÇßÀ» ¶§ ó¸®ÇÏ´Â ÇÔ¼öÀÌ´Ù. 󸮴 µÎºÎºÐÀ¸·Î ±¸ºÐÇØ º¼ ¼ö ÀÖ´Ù. º¯¼ö °ªÀ» ²¨³»´Â ºÎºÐ°ú, ²¨³»Áø °ªÀ» Á¶ÇÕÇÏ¿© Ãâ·ÂÇÒ ³»¿ëÀ» ¸¸µå´Â ºÎºÐÀÌ´Ù. email°ú color°ªÀ» ±â¹ÝÀ¸·Î Ãâ·ÂÇÒ ³»¿ëÀ» º¯¼ö Output¿¡ ÀúÀåÇÑ´Ù.  ±×¸®°í ÃÖÈÄ¿¡ ¸¸µé¾îÁø °á°ú¸¦ Ç¥½ÃÇϱâ À§ÇØ Display()ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

ProcessForm() ÀÌÈÄÀÇ ¸¶Áö¸· ºÎºÐÀÌ ½ÇÁ¦ ÄÚµåÀÇ ½ÇÇàÀÌ ½ÃÀ۵Ǵ ºÎºÐÀÌ´Ù. ÆûÀÇ key°ªÀÌ processÀ̸é ProcessForm()À» È£ÃâÇϰí, óÀ½ È£ÃâÇÒ ¶§¿Í °°ÀÌ °ªÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é DisplayForm()À» È£ÃâÇÑ´Ù.

 

 

ÆÄÀ̽㿡¼­ µ¥ÀÌÅͺ£À̽º »ç¿ëÇϱâ

CGI ÇÁ·Î±×·¡¹Ö¿¡¼­ ¸¶Áö¸·À¸·Î ¹è¿ö¾ß ÇÒ ºÎºÐÀÌ ¾î¶»°Ô ÇÏ¸é µ¥ÀÌÅͺ£À̽º ÁúÀǾð¾î (SQL)¸¦ ÆÄÀ̽㿡¼­ »ç¿ëÇÒ ¼ö ÀÖÀ»±î ÇÏ´Â °ÍÀÌ´Ù. ÆÄÀ̽ãÀº µ¥ÀÌÅ׺£À̽º¿Í ÀÛ¾÷À» ÇϱâÀ§ÇÏ¿© Ç¥ÁØ API(Application Programming Interface)¸¦ Á¦°øÇÑ´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â Á¦°øµÇ´Â ¸ðµç µ¥ÀÌÅͺ£À̽º¿¡¼­ µ¿ÀÏÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ ¿©·¯ºÐÀº ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏÁö ¾Ê°íµµ ¾î¶°ÇÑ µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù(ÀÌ·ÐÀûÀ¸·Î´Â).

ÇöÀç Python DBI (Database Interface) ´ëºÎºÐÀÇ ÀϹÝÀûÀÎ µ¥ÀÌÅͺ£À̽º¸¦ Áö¿øÇÑ´Ù - Gadfly, mSQL, MySQL, Oracle, PostgreSQL, Informix, Interbase, Sybase, Solid

Ç¥ÁØÀûÀÎ ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÏÁö¸¸ ´Ù¸¥ µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇϱâ À§Çؼ­´Â °¢ DB¿¡ ¸Â´Â ¸ðµâÀÌ ÀÖ¾î¾ß ÇÏ´Â °ÍÀ» ÀØÁö´Â ¸»¾Æ¶ó(³ëÆÄ½É¿¡¼­ ÇѸ¶µð).  

´õ¿í ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¿øÇÑ´Ù¸é the Database SIG (Special Interest Group)¿¡ °¡º¸¶ó.

¿©±â¼­´Â MySQLÀ» ÀÌ¿ëÇÑ ¾ÆÁÖ ´Ü¼øÇÑ Àбâ ÁúÀǸ¦ ´Ù·é´Ù. óÀ½¿¡ ÇØ¾ß ÇÒ ÀÏÀº ¸ðµâÀ» importÇÏ´Â °ÍÀÌ´Ù.

    import MySQLdb

MySQL DBI ¸ðµâÀ» ºÒ·¶À¸¸é, µ¥ÀÌÅͺ£À̽º¸¦ ¿¬°áÇÔÀ¸·Î ÃʱâÈ­ÇÑ´Ù. ÀÌ ¿¬°áÀ» À§Çؼ­ Ŭ·¡½º ÀνºÅϽº¸¦ »ý¼ºÇØ¾ß Çϴµ¥ Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

    MySQLdb.connect(host, user, passwd, db, port, unix_socket, client_flag)
     
    ÀÌ ÀÎÅÍÆäÀ̽º´Â Ű¿öµå Àμö¸¦ ÅëÇØ¼­ ÇÊ¿äÇÑ °ª¸¸ Àü´ÞÇÑ´Ù.
     
    host - hostname (NULL : default)
    user - username (NULL)
    passwd - password (no password)
    db - database name (NULL)
    port - integer, TCP/IP port
    unix_socket - TCP¸¦ »ç¿ëÇÒ unix¼ÒÄÏÀÇ À§Ä¡
    client_flag - integer, ÇÊ¿äÇÒ °æ¿ì »ç¿ëÇϱâ À§ÇÑ flag (0)

»ç¿ëÀÚ¸¦ gslee ¾ÏÈ£¸¦ secretpassword¶ó ÇÒ ¶§ localhost¿¡¼­ guestbookÀ̶ó´Â µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇϱâ À§ÇÑ ÃʱâÈ­ ¿¹´Â ´ÙÀ½°ú °°´Ù.


    import MySQLdb connection = MySQLdb.connect(user='gslee', passwd='secretpassword', db='guestbook') cursor = connection.cursor() # Ä¿¼­ °´Ã¼¸¦ ¾ò¾î¿Â´Ù. ..... cursor.close() #»ç¿ëÀÌ Á¾·áµÇ¸é ´Ý¾ÆÁØ´Ù. (Á÷Á¢ ¾ÈÇϸé ÀÚµ¿À¸·Î ´Ý¾ÆÁø´Ù)

¸¶Áö¸· ¹®ÀåÀº Ä¿¼­(cursor)¶ó°í ºÒ¸®´Â °ÍÀ» ¸®ÅÏÇß´Ù. ÀÌ °´Ã¼ÀÇ À̸§À» 'Ä¿¼­'¶ó°í Çϴµ¥, ¸ðµç µ¥ÀÌÅͺ£À̽ºÀÇ ¾×¼ÇÀº Ä¿¼­¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. ÇÁ·Î±×·¥°ú µ¥ÀÌÅͺ£À̽º¸¦ ¿¬°á ÇØ ÁÖ´Â °ÍÀÌ Ä¿¼­ÀÇ ¿ªÇÒÀ̶ó ÇÒ ¼ö ÀÖ´Ù. Ä¿¼­ °´Ã¼´Â execute()¿Í fetchall()°ú °°Àº ¸î °³ÀÇ ¸Þ½áµå¸¦ °¡Áö°í ÀÖ´Ù.  execute()´Â ½ÇÁ¦ÀûÀ¸·Î SQL ¹®À» ¼öÇàÇϱâ À§ÇØ »ç¿ëµÇ¸ç fetchall()Àº execute()ÀÇ °á°ú¸¦ ÅÍÇà Çü½ÄÀ¸·Î ¾ò±â À§Çؼ­ »ç¿ëµÈ´Ù. °¢ ÅÍÇÃÀº µ¥ÀÌÅͺ£À̽ºÀÇ Çà(·¹ÄÚµå)¿¡ ´ëÀÀµÈ´Ù.

Ä¿¼­°¡ ÀÖ´Ù¸é, cursor.execute(statement)¿Í °°Àº Çü½ÄÀ¸·Î µ¥ÀÌÅͺ£À̽º°¡ Áö¿øÇÏ´Â ¾î¶°ÇÑ SQL ¹®µµ ¼öÇàÇÒ ¼ö ÀÖ´Ù. Àüü ·¹Äڵ带 ¾ò´Â °£´ÜÇÑ ¿¹¸¦ ¾Æ·¡¿¡ º¸ÀδÙ.

     
    
    #¸ðµç ¿£Æ®¸®¸¦ ¾ò´Â´Ù. myquery = "SELECT * FROM gbook ORDER BY stamp" cursor.execute(myquery) #ÁúÀÇ ¼öÇà Result = cursor.fetchall() # °á°ú °¡Á®¿À±â total = len(Result) # °á°ú ·¹ÄÚµå ¼ö ¾ò±â   entries = []   if total < 1:     print 'No guest book entries!' else:     for record in range(total): entry = {} # °ø »çÀü         entry['gid'] = Result[record][0] # guestbook ID         entry['stamp'] = Result[record][1] # time stamp         entry['name'] = Result[record][2] # ...         entry['email'] = Result[record][3] entries.append(entry) # ¸®½ºÆ®¿¡ Á¤º¸ Ãß°¡   for entry in entries: print entry['name'] + ' email:' + entry['email'] + '...'  

 °á°ú°¡ Result¿¡ ÀúÀåµÇ¸ç, ÁúÀÇ °á°ú·Î ³Ñ¾î¿Â Àüü ·¹ÄÚµå ¼ö´Â total¿¡ ÀúÀåµÈ´Ù. Result¿¡ ÀúÀåµÈ °á°ú´Â ÅÍÇÃÀÇ ¸®½ºÆ® Çü½ÄÀ̹ǷΠ°¢ Çʵ忡 ¸ÂÃ߾ Á¤º¸¸¦ ¾ò±â À§Çؼ­´Â Çʵå À̸§°ú À§Ä¡ Á¤º¸¸¦ ¹Ì¸® ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. 0¹øÂ° Çʵå´Â guestbook ID·Î »ç¿ëµÇ°í ÀÖ´Â °ÍÀ» ¾Æ´Â »óÅ¿¡¼­ À§¿Í °°ÀÌ Á¤º¸¸¦ ÃßÃâ ÇÒ ¼ö ÀÖ´Ù. ÀÌ¿Í °°Àº »çÀü Á¤º¸ ¾øÀÌ °¢ ÇʵåÀÇ À̸§°ú µ¥ÀÌÅÍ Çü, Å©±âµîÀ» ¾Ë°í ½Í´Ù¸é execute¸¦ ¼öÇàÇÑ ÈÄ, description Ư¼ºÀ» ÀÌ¿ëÇϸé Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ¿¡ °üÇÑ ÀÚ¼¼ÇÑ »çÇ×Àº Python Database API 2.0 ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.

for¹®¿¡¼­ °¢ ·¹ÄÚµå ´ÜÀ§·Î Á¤º¸°¡ »çÀü Çü½ÄÀ¸·Î entry¿¡ ÀúÀåµÇ°í, ±× »çÀüÀº ´Ù½Ã entries ¸®½ºÆ®¿¡ Ãß°¡µÈ´Ù.

¸¶Áö¸· for¹®Àº ÀúÀåµÈ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.

µ¥ÀÌÅͺ£À̽º¸¦ ´Ù·ç´Â °Í¿¡ ´ëÇØ¼­ ÃæºÐÇÏ°Ô ´Ù·çÁö´Â ¸øÇßÁö¸¸ CGI¿Í ¿¬°áÇØ¼­ ´Ù·ê ¸¸Å­ÀÇ ±âÃÊ´Â ÃæºÐÇÏ´Ù°í »ý°¢µÈ´Ù. ¾ÕÀ¸·Î ¹®¼­°¡ °»½ÅµÈ´Ù¸é Á»´õ ÀÚ¼¼ÇÏ°Ô µ¥ÀÌÅͺ£À̽º¸¦ ´Ù·ç´Â ·çƾÀ» ¼Ò°³ÇϰڴÙ.

 

Python Database API 2.0 Ä¿¼­ °´Ã¼¿¡ ´ëÇØ¼­ Á» ´õ ÀÚ¼¼È÷

ÀÌ API´Â µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÏ´Â À¯»çÇÑ ÆÄÀ̽㠸ðµâ°£ÀÇ È£È¯¼ºÀ» À¯ÁöÇϱâ À§Çؼ­ Á¤ÀǵǾú´Ù. À̰ÍÀ» ¸¸µé°í »ç¿ëÇÔÀ¸·Î ´Ù¸¥ µ¥ÀÌÅͺ£À̽º¿¡ º¯°æ¾øÀÌ ½±°Ô Àû¿ë °¡´ÉÇÑ ÀÌÇØÇϱ⠽¬¿î Äڵ带 »ý¼ºÇÒ ¼ö ÀÖ´Ù. (À̰ÍÀº Ä¿´Ù¶õ ÀåÁ¡ÀÌ´Ù!!)

Ä¿¼­ °´Ã¼

Ä¿¼­ °´Ã¼´Â ÁúÀǸ¦ ¼öÇàÇÏ°í ½ÇÇàµÈ °á°ú¸¦ °¡Á®¿À±â À§Çؼ­ »ç¿ëµÈ´Ù. Ä¿¼­ °´Ã¼¸¦ ¸¸µå´Â ¹æ¹ýÀº ¾ÕÀý¿¡¼­ ±â¼úÇÏ¿´Áö¸¸ ´ÙÀ½°ú °°ÀÌ connection °´Ã¼·ÎºÎÅÍ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.

    import MySQLdb
    connection = MySQLdb.connect(user='guest', db='test')
    cursor = connection.cursor()  # Ä¿¼­ °´Ã¼¸¦ ¾ò¾î¿Â´Ù.

ÀÏ´Ü Ä¿¼­ °´Ã¼¸¦ ¹Þ¾ÒÀ¸¸é execute ¸Þ½áµå¸¦ ÀÌ¿ëÇÏ¿© ÁúÀǸ¦ ¼öÇàÇÒ ¼ö ÀÖ´Ù.

    cursor.execute('select * from pet')

¾Æ¹« ¸Þ½ÃÁö ¾øÀÌ ´Ù¸§ ÇÁ·ÒÇÁÆ®°¡ ³ª¿À¸é ¼º°øÇÑ °ÍÀÌ´Ù. ÁúÀÇ °á°ú·Î ¾ò¾îÁø °¢ ÇʵåÀÇ Æ¯¼ºÀ» ¾Ë°í ½ÍÀ¸¸é description Ư¼º(attribute)À» ÀÌ¿ëÇ϶ó.

    print cursor.description
     
    (('name', 253, 8, 20, 20, 0, 1), ('owner', 253, 6, 20, 20, 0, 1), 
      ('species', 253, 7, 20, 20, 0, 1), ('sex', 254, 1, 1, 1, 0, 1), 
      ('birth', 10, 10, 10, 10, 0, 1), ('death', 10, 10, 10, 10, 0, 1))  

°á°ú´Â 7°³ ½ÃÄö½ºÀÇ ½ÃÄö½º(ÅÍÇÃ)Àε¥, 7°³ °ªÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.

    (name, type_code, display_size, internal_size, precision, scale, null_ok)
     
    (Çʵå¸í, µ¥ÀÌÅÍÇü_ÄÚµå, Ç¥½ÃÅ©±â, ³»ºÎÅ©±â, Á¤È®µµ, ºñÀ², null°¡´É¿©ºÎ)

('name', 253, 8, 20, 20, 0, 1)À» ¿¹¸¦ µé¾î ¼³¸íÇÏ¸é ´ÙÀ½°ú °°´Ù.

    ÇʵåÀ̸§('name')-name, µ¥ÀÌÅÍÇü(253)-VARCHAR, Ç¥½ÃÅ©±â(8)-8, 
    ³»ºÎÅ©±â(20)-20 (VARCHAR(20)À¸·Î ¼±¾ðµÇ¾ú´Ù.), 
    Á¤È®µµ-20, ºñÀ²-0(½ºÆ®¸µ¿¡¼­ º° ÀÇ¹Ì ¾øÀ½), null°¡´É(1)-Yes

descriptionÀº ¸¸ÀÏ execute()¸¦ È£ÃâÇÑ ÀûÀÌ ¾ø°Å³ª °Ë»ö °á°ú ÇàÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù¸é None°ªÀ» °®´Â´Ù.

rowcount´Â °Ë»ö(select) °á°ú ·¹ÄÚµåÀÇ ¼ö ȤÀº (update, insertµîÀ¸·Î) º¯°æµÈ ·¹ÄÚµåÀÇ ¼ö¸¦ ¾Ë·ÁÁØ´Ù.

    print cursor.rowcount
     
    11L

ÁúÀÇ °á°ú¸¦ °¡Á®¿À±â À§Çؼ­´Â fetchone(), fetchmany(), ȤÀº fetchall() ¸Þ½áµå¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    res = cursor.fetchone()  # °á°ú ÇÑ °³ °¡Á®¿À±â
    res = cursor.fetchall()  # °á°ú ¸ðµÎ °¡Á®¿À±â
    res = cursor.fetchmany(10) # °á°ú 10°³ °¡Á®¿À±â

À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ fetchone()Àº ÇϳªÀÇ ·¹Äڵ带 ÅÍÇ÷Π¸®ÅÏÇϸç, fetchall()Àº ¸ðµç ·¹Äڵ带 ÅÍÇÃÀÇ ¸®½ºÆ®·Î ¸®ÅÏÇÑ´Ù.

fetchmany(n)Àº n°³ ¸¸Å­ÀÇ ·¹Äڵ带 °¡Á®¿Â´Ù. ¸¸ÀÏ ¼ýÀÚ°¡ ÁöÁ¤µÇÁö ¾ÊÀ¸¸é (±âº»°ªÀ» »ç¿ëÇϸé) cursor.arraysize ¸¸Å­ÀÇ ·¹Äڵ带 °¡Á®¿Â´Ù. ¸¸ÀÏ ÃæºÐÇÏÁö ¾ÊÀº ·¹Äڵ尡 ³²¾ÆÀÖ´Ù¸é ±× ³²¾ÆÀÖ´Â ·¹Äڵ尡 ³Ñ¾î¿Â´Ù. °¡´ÉÇÑ ÇÑ ÀÏÁ¤ÇÑ ¼öÀÇ ·¹Äڵ带 ¿ä±¸ÇÏ´Â °ÍÀÌ ½Ã½ºÅÛ ¼º´É¿¡ µµ¿òÀ» ÁØ´Ù.

¸¸ÀÏ execute()¿¡¼­ ¾Æ¹« °á°ú°¡ ¾ø¾ú´Ù¸é ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù.

res = cursor.fetchall()ÀÇ ÁúÀÇ °á°ú´Â ÅÍÇÃÀÇ ¸®½ºÆ® ÇüÅ·ΠÀúÀåµÈ´Ù. ÇϳªÀÇ ÅÍÇÃÀº ÇϳªÀÇ Çà(·¹ÄÚµå)¸¦ ³ªÅ¸³½´Ù.

    res = cursor.fetchall()  # °á°ú ¸ðµÎ °¡Á®¿À±â
    print res
     
    [('Puffball', 'Diane', 'hamster', 'f', '1999-03-30', None), ('buffy', 'harold',
    'dog', 'f', '1990-05-13', '0000-00-00'), ('Claws', 'Gwen', 'cat', 'm', '1994-03-
    17', '0000-00-00'), ('whistler', 'gwen', 'bird', 'n', '1997-12-09', '0000-00-00'
    ), ('Fluffy', 'Harold', 'cat', 'f', '1993-02-04', None), ('Chirpy', 'Gwen', 'bir
    d', 'f', '1998-09-11', None), ('Bowser', 'Diane', 'dog', 'm', '1989-08-31', '199
    5-07-29'), ('fang', 'benny', 'dog', 'm', '1998-08-27', '0000-00-00'), ('slim', '
    benny', 'snake', 'm', '1996-04-29', '0000-00-00'), ('fang', 'benny', 'dog', 'f',
     '1998-09-22', '0000-00-00'), ('slim', 'benny', 'snak', 'm', '1996-04-29', '0000
    -00-00')]                    

 Á»´õ ǰÀ§ ÀÖ°Ô Á¤º¸¸¦ Ãâ·ÂÇÏ·Á¸é ´ÙÀ½°ú °°Àº Äڵ带 ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

    res = cursor.fetchall()  # °á°ú ¸ðµÎ °¡Á®¿À±â
    print "%-10s %-8s %-8s %1s %11s %11s" % ('name', 'owner', 'species', 's', 'birth', 'death')
    print
    for record in res:
        print "%-10s %-8s %-8s %1s %11s %11s" % record
     
    name       owner    species  s       birth       death 
     
    Puffball   Diane    hamster  f  1999-03-30        None
    buffy      harold   dog      f  1990-05-13  0000-00-00
    Claws      Gwen     cat      m  1994-03-17  0000-00-00
    whistler   gwen     bird     n  1997-12-09  0000-00-00
    Fluffy     Harold   cat      f  1993-02-04        None
    Chirpy     Gwen     bird     f  1998-09-11        None
    Bowser     Diane    dog      m  1989-08-31  1995-07-29
    fang       benny    dog      m  1998-08-27  0000-00-00
    slim       benny    snake    m  1996-04-29  0000-00-00
    fang       benny    dog      f  1998-09-22  0000-00-00
    slim       benny    snak     m  1996-04-29  0000-00-00                         

¶Ç´Â ´ÙÀ½°ú °°ÀÌ Çϳª¾¿ Ãâ·ÂÇÒ ¼öµµ ÀÖ´Ù. À§¿Í °°Àº Ãâ·ÂÀ» ¾òÀ» °ÍÀÌ´Ù.

    print "%-10s %-8s %-8s %1s %11s %11s" % ('name', 'owner', 'species', 's', 'birth', 'death')
    print
    while 1:
        record = cursor.fetchone() # °á°ú Çϳª °¡Á®¿À±â
        if record == None: break   # ¾øÀ¸¸é ºüÁ®³ª°¨
        print "%-10s %-8s %-8s %1s %11s %11s" % record