|
ÆÄÀ̽ã(Python)À¸·Î CGI ÇÁ·Î±×·¥ ÀÛ¼ºÇϱâ 2000.1.26 Â÷·Ê
¿©±â »ç¿ëµÈ ¼Ò½º¸¦ ´Ù¿î ¹ÞÀ¸·Á¸é ¿©±â(WinZip ÆÄÀÏ) ¶Ç´Â ¿©±â(tar.gz ÆÄÀÏ)¸¦ Ŭ¸¯Çϼ¼¿ä!!!
¸ÕÀú, ÆÄÀ̽ã(Python)Àº ¹ü¿ë ¾ð¾î¶ó´Â °ÍÀ» ¸»Çؾ߰ڴÙ. ÆÄÀ̽ãÀº ´ëºÎºÐÀÇ À¥ ÇÁ·Î±×·¡¹Ö¿¡ Àû´çÇÏÁö¸¸, ´ÜÁö ¸î °³ÀÇ SSI(Server Side Include) ÆäÀÌÁö°¡ ÇÊ¿äÇÏ´Ù¸é PHP¿Í °°Àº ¾ð¾î°¡ ´õ Àû´çÇÒ °ÍÀÌ´Ù. PerlÀº CGIÀÇ '¿Õ'À¸·Î ¾Ë·ÁÁ®ÀÖ´Ù. PerlÀº ÅØ½ºÆ® ½ºÄ³´×°ú ÇÁ·Î¼¼½Ì¿¡ Àß ¸Â´Â ¾ð¾îÀ̰í, È®ÀåµÈ CGI ¸ðµâÀº Àß ¼³°èµÇ¾ú´Ù. ÇÏÁö¸¸, Àü¹®ÀûÀÎ Perl ÇÁ·Î±×·¡¸Ó¸¦ Á¦¿ÜÇϰí´Â PerlÀ» ÀÌ¿ëÇÏ¿© ºü¸¥ ¾îÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϱâ¶õ º¸ÅëÀÇ ÇÁ·Î±×·¡¸Ó·Î´Â »ý°¢ÇÏ±â ¾î·Æ´Ù. ÆÞÀÇ ÀâÀ½ °°Àº ¹®¹ý°ú '¾î¶² ÀÏÀ» ¼öÇàÇϴµ¥´Â ÇѰ¡Áö ÀÌ»óÀÇ ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù'¶ó´Â öÇÐÀº °ü¸®Çϱ⠾î·Á¿î º¹ÀâÇÑ Äڵ带 ¸¸µé¾î ³½´Ù. ±¦Âú°í °·ÂÇÑ ÇÁ·Î±×·¥ÀÌ ÆÞ·Î ¾²¿©Áú ¼ö ¾ø´Ù°í À̾߱âÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ¶§¶§·Î ´Ù¸¥ »ç¶÷ÀÇ º¹ÀâÇÑ Äڵ带 ÀÌÇØÇϱâ À§Çؼ ¾ð¾î ÀÚü¿¡ °üÇÑ Áö½ÄÀÌ ÇÊ¿äÇÏ´Ù. ¸¸ÀÏ ¿©·¯ºÐÀÌ Ã³À½ºÎÅÍ À¥ ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇÏ·Á ÇÑ´Ù¸é ÆÄÀ̽ãÀ» ÁøÁöÇÏ°Ô °í·ÁÇØºÁ¾Æ¾ß ÇÒ °ÍÀÌ´Ù. '±× ÀÏÀ» Çϱ⿡´Â ¹Ù·Î ÀÌ·± ¹æ¹ýÀÌ Á¸ÀçÇØ!' ¿Í °°ÀÌ ¸í¹éÇÑ ¹æ¹ý·ÐÀ» Á¦°øÇÏ´Â ÆÄÀ̽ãÀ» ¸»ÀÌ´Ù. ÆÄÀ̽ãÀº ´Ù¸¥ ¾î¶² ¾ð¾îº¸´Ùµµ ´õ ±ò²ûÇÑ ¹®¹ýÀ» °®´Â´Ù. ¶ÇÇÑ, ÆÄÀ̽ã ÀÚü°¡ °´Ã¼ÁöÇâÀ» À§Çؼ ¸¸µé¾î Á³´Ù. ÇÏÁö¸¸ Ŭ·¡½º¸¦ »ç¿ëÇ졂 ¸»°Ç ±×°ÍÀº »ç¿ëÀÚ¿¡ ´Þ·È´Ù. Ŭ·¡½º¸¦ »ç¿ëÇÏÁö ¾Ê´õ¶óµµ ¸ðµâ´ÜÀ§ÀÇ °´Ã¼ °³³äÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÆÄÀ̽ãÀº ±ò²ûÇϰí, Àбâ ÁÁÀº ±¸¹® ±¸Á¶´Â ÀÌ ¾ð¾î¸¦ ¹è¿ì´Â »ç¶÷µé¿¡°Ô 'Ãູ'À̶ó°í±îÁö ÇÒ ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡ ¼¹ö¿¡¼ ÇÁ·Î±×·¥À» °³¹ßÇÏ´Â »ç¶÷µéÀº mod_python À̳ª pyApache ¸ðµâÀÌ ¾ÆÆÄÄ¡ ¾È¿¡ ¼û°ÜÁ®¼ ÆÞ ÇÁ·Î±×·¥ÀÇ ¼öÇà¼Óµµ¿Í °ßÁÙ Á¤µµ°¡ µÇ´Â °Í¿¡ ³î¶ö °ÍÀÌ´Ù. ÃÖ±Ù¿¡ ÆÄÀ̽ãÀº ¸Å¿ì È®ÀåÀûÀ̰í, Àß Á¤¸®µÈ ´Ù¾çÇÑ À¯¿ëÇÑ Æ÷ÅÍºí ¶óÀ̺귯¸®¸¦ °®´Â ¸ðµâÀÌ °³¹ßµÇ¾î¿Ô´Ù. ÀÎÅÍ³Ý °ü·Ã ¸ðµâÀº »ó´çÈ÷ Èï¹ÌÀÖ¾î¼, ÆÄ½Ì, URL°Ë»öºÎÅÍ POP¼¹ö·ÎºÎÅÍ ¸ÞÀÏÀ» °¡Á® ¿À´Â °Í±îÁö, ±×¸®°í ±× »çÀÌÀÇ ¸ðµç ±â´ÉÀÌ ÀÖ´Ù. GUIºÎÅÍ µ¥ÀÌÅͺ£À̽º±îÁö ´Ù·ç´Â ¶Ç ´Ù¸¥ ¸ðµâµéµµ Á¸ÀçÇÑ´Ù.
¿©±â¼ ¿ì¼±, ¿©·¯ºÐÀÌ ÆÄÀ̽㠽ÇÇà ȯ°æÀ» °®Ãß°í ÀÖ°í À¥¼¹ö°¡ ÁغñµÇ¾îÀÖ´Ù°í °¡Á¤ÇϰڴÙ. (±×·¸Áö ¾ÊÀ¸¸é ´õ ÁøÇàÇÒ ¼ö ¾ø´Ù.) ¸ÕÀú ¼³¸íÇØ¾ß ÇÒ °ÍÀº ¿©·¯ºÐÀÌ ¾ÆÆÄÄ¡ ¼¹ö¸¦ »ç¿ëÇϰí ÀÖ´Ù¸é 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¶ó ÇÏÀÚ. ¾Æ¹« ÅØ½ºÆ® ÆíÁý±â¸¦ »ç¿ëÇÏ¿© ´ÙÀ½ ÆÄÀÏÀ» ¸¸µç´Ù.
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 ¿ä¼ÒÀÇ À̸§À» ¾Ë¸é ´ÙÀ½°ú °°ÀÌ ½±°Ô °ªÀ» ¾òÀ» ¼ö ÀÖ´Ù.
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"¸¦ º¸°Ô µÉ °ÍÀÌ´Ù. ¿¹¿Üó¸®ÀÇ ÀÚ¼¼ÇÑ ³»¿ëÀº ÆÄÀ̽㠸Ŵº¾óÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù. °£´ÜÈ÷ ó¸®ÇÏ´Â ¿¹¸¦ ¿©±â¼ º¸ÀÌ¸é ´ÙÀ½°ú °°´Ù.
Á¾ÇÕÇØ¼ °£´ÜÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸ÀÚ. HTML ÆûÀÌ Á¦°øÇÏ´Â ¸ðµç º¯¼ö¸¦ Ãâ·ÂÇÏ´Â ¿¹¸¦ ÀÛ¼ºÇØ º¸ÀÚ. (prfield.py)
º¸´Â ¹Ù¿Í °°ÀÌ, ÀÌ ÇÁ·Î±×·¥Àº 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"> Æû ű׿¡¼ action="http://sr.kwangwoon.ac.kr/cgi-bin/cgiwrap/~gslee/prfield.py" ´Â È£ÃâÇÒ cgi ÇÁ·Î±×·¥ÀÇ URLÀ» ±â¼úÇÑ´Ù.
¾ÕÀÇ ¿¹¸¦ ºÁ¼ ¾Ë°ÚÁö¸¸, CGI¶õ »ý¼ºµÈ Á¤º¸¸¦ °®´Â »õ·Î¿î ¹®¼¸¦ ¸¸µé¾î ÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. Á¤º¸¸¦ »ý¼ºÇÏ´Â °ÍÀº ÀÀ¿ë¿¡ µû¶ó¼ ½¬¿ï ¼öµµ ÀÖ°í ¾î·Á¿ï ¼öµµ ÀÖ´Ù. ±× °ÍÀº ÀÏ¹Ý ÇÁ·Î±×·¡¹Ö°ú ´Ù¸£Áö ¾Ê´Ù. ±×·¯³ª ¾î¶°ÇÑ °æ¿ì¿¡³ª ¹®¼¸¦ Á» ´õ ¸ÚÁö°Ô º¸À̱â À§Çؼ´Â HTML ¹®¼ Çü½ÄÀ¸·Î Ãâ·ÂÇØ¾ß Çϴµ¥, ÀÌ °ÍÀ» CGIÇÁ·Î±×·¥»ó¿¡¼ Çϱ⿡´Â Á» ¹ø°Å·Ó´Ù. ¹°·Ð ¸¹Àº °æ¿ì ±×·¸°Ô Çϱ⵵ ÇÏÁö¸¸, ÇÁ·Î±×·¥ÀÌ Ä¿Áú¼ö·Ï °ü¸®ÇϱⰡ Á¡Á¡ ´õ ¾î·Á¿öÁø´Ù. °¡Àå ÁÁÀº ÇØ°á ¹æ¹ýÀº HTML¹®¼ÀÇ Æ²Àº HTML ¹®¼ ÆíÁý±â·Î ÆíÁýÇÑ´Ù(µðÀÚÀÎ). ±×¸®°í ±× Ʋ ¾ÈÀÇ ¿øÇÏ´Â À§Ä¡¿¡ CGI¿¡¼ »ý»êµÈ Á¤º¸¸¦ ¹èÄ¡½ÃŰ¸é µðÀÚÀΰú ÇÁ·Î±×·¥ ÀÛ¾÷À» ºÐ¸®ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ. ½ÇÁ¦ÀûÀÎ HTML¹®¼´Â ÀÌ°Í º¸´Ù´Â ÈξÀ ´õ º¹ÀâÇϰÚÁö¸¸ ±âº»ÀûÀÎ ¾ÆÀ̵ð¾î¸¦ ¼³¸íÇϱâ À§ÇÏ¿© °¡Àå °£´ÜÇÑ ¹®¼¸¦ ¸¸µé¾ú´Ù. template.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¸¦ ¸¸µé ¸ðµç Áغñ´Â µÆ´Ù.
BadTemplateExceptionÀº Ʋ ÆÄÀÏÀÌ ¸Á°¡Á³À» ¶§ ¿¹¿Ü¸¦ ¹ß»ý½Ã۱â À§Çؼ Á¤ÀǵǾú´Ù. ¸¸ÀÏ Æ² ÆÄÀÏ¿¡¼ ÁÖ¼®À» ¹ß°ßÇÒ ¼ö ¾øÀ» ¶§´Â Ä¡¸íÀûÀÎ ¿¡·¯¸¦ ¹ß»ý½Ã۰í ÇÁ·Î±×·¥À» Áß´ÜÇÑ´Ù. ¶ÇÇÑ ÇÁ·Î±×·¥ÀÌ ´Ü¼øÈ÷ Ʋ ÆÄÀÏÀ» open ÇÒ ¼ö ¾øÀ» ¶§¿¡µµ (unhandled, fatal) ¿¹¿Ü¸¦ ¹ß»ý½ÃŲ´Ù. ¾Õ¼ ¼³¸íÇßµíÀÌ ´ÙÀ½ ¹®Àº Ʋ ÆÄÀÏ ÅØ½ºÆ®(TemplateInput) ÀÇ <!-- *** INSERT CONTENT HERE *** -->¸¦ Content º¯¼ö¿¡ ÀúÀåµÈ ¹®ÀÚ¿·Î ¹Ù²Û´Ù.
subn ÇÔ¼ö´Â ÅÍÇÃÀ» µ¹·ÁÁִµ¥ ù ¹øÂ° °ªÀº ġȯµÈ ¹®ÀÚ¿ÀÌ°í µÎ ¹øÂ°´Â Á¤¼ö°ªÀ¸·Î ¼º°øÇßÀ¸¸é 1, ½ÇÆÐÇßÀ¸¸é 0ÀÇ °ªÀ» °®´Â´Ù. ¿©·¯ºÐÀº ÀÌÁ¦ ÀÚ½ÅÀÇ CGI ÇÁ·Î±×·¥¿¡¼ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Ãâ·ÂÇÒ ¿ÏÀüÇÑ ¹®ÀÚ¿ÀÌ ÁغñµÇ¸é DisplayÇÔ¼ö¸¦ ºÒ·¯¶ó.
¾Õ¼ÀÇ ¿¹¿¡¼´Â ÆûÀ» »ý¼ºÇÏ´Â HTML¹®¼¿Í ÆûÀ» ó¸®ÇÏ´Â CGI ÇÁ·Î±×·¥ÀÌ º°µµ·Î ÀÛ¼ºµÇ¾ú´Ù. ¿©±â¿¡¼´Â ÇϳªÀÇ CGI ÇÁ·Î±×·¥ÀÌ ÆûÀ» »ý¼ºÇϰí, »ý¼ºµÈ Æû¿¡¼ ¿ä±¸ÇÏ´Â ³»¿ëÀ» ó¸®ÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏÀÚ. ¸ÕÀú, »ç¿ëµÉ ÆûÀ» ´ÙÀ½¿¡ º¸ÀδÙ. form.html Àüü ÇÁ·Î±×·¥Àº ´ÙÀ½¿¡ º¸ÀδÙ. sample1.py:
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À̶ó´Â µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇϱâ À§ÇÑ ÃʱâÈ ¿¹´Â ´ÙÀ½°ú °°´Ù.
¸¶Áö¸· ¹®ÀåÀº Ä¿¼(cursor)¶ó°í ºÒ¸®´Â °ÍÀ» ¸®ÅÏÇß´Ù. ÀÌ °´Ã¼ÀÇ À̸§À» 'Ä¿¼'¶ó°í Çϴµ¥, ¸ðµç µ¥ÀÌÅͺ£À̽ºÀÇ ¾×¼ÇÀº Ä¿¼¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. ÇÁ·Î±×·¥°ú µ¥ÀÌÅͺ£À̽º¸¦ ¿¬°á ÇØ ÁÖ´Â °ÍÀÌ Ä¿¼ÀÇ ¿ªÇÒÀ̶ó ÇÒ ¼ö ÀÖ´Ù. Ä¿¼ °´Ã¼´Â execute()¿Í fetchall()°ú °°Àº ¸î °³ÀÇ ¸Þ½áµå¸¦ °¡Áö°í ÀÖ´Ù. execute()´Â ½ÇÁ¦ÀûÀ¸·Î SQL ¹®À» ¼öÇàÇϱâ À§ÇØ »ç¿ëµÇ¸ç fetchall()Àº execute()ÀÇ °á°ú¸¦ ÅÍÇà Çü½ÄÀ¸·Î ¾ò±â À§Çؼ »ç¿ëµÈ´Ù. °¢ ÅÍÇÃÀº µ¥ÀÌÅͺ£À̽ºÀÇ Çà(·¹ÄÚµå)¿¡ ´ëÀÀµÈ´Ù. Ä¿¼°¡ ÀÖ´Ù¸é, cursor.execute(statement)¿Í °°Àº Çü½ÄÀ¸·Î µ¥ÀÌÅͺ£À̽º°¡ Áö¿øÇÏ´Â ¾î¶°ÇÑ SQL ¹®µµ ¼öÇàÇÒ ¼ö ÀÖ´Ù. Àüü ·¹Äڵ带 ¾ò´Â °£´ÜÇÑ ¿¹¸¦ ¾Æ·¡¿¡ º¸ÀδÙ.
°á°ú°¡ Result¿¡ ÀúÀåµÇ¸ç, ÁúÀÇ °á°ú·Î ³Ñ¾î¿Â Àüü ·¹ÄÚµå ¼ö´Â total¿¡ ÀúÀåµÈ´Ù. Result¿¡ ÀúÀåµÈ °á°ú´Â ÅÍÇÃÀÇ ¸®½ºÆ® Çü½ÄÀ̹ǷΠ°¢ Çʵ忡 ¸ÂÃß¾î¼ Á¤º¸¸¦ ¾ò±â À§Çؼ´Â Çʵå À̸§°ú À§Ä¡ Á¤º¸¸¦ ¹Ì¸® ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. 0¹øÂ° Çʵå´Â guestbook ID·Î »ç¿ëµÇ°í ÀÖ´Â °ÍÀ» ¾Æ´Â »óÅ¿¡¼ À§¿Í °°ÀÌ Á¤º¸¸¦ ÃßÃâ ÇÒ ¼ö ÀÖ´Ù. ÀÌ¿Í °°Àº »çÀü Á¤º¸ ¾øÀÌ °¢ ÇʵåÀÇ À̸§°ú µ¥ÀÌÅÍ Çü, Å©±âµîÀ» ¾Ë°í ½Í´Ù¸é execute¸¦ ¼öÇàÇÑ ÈÄ, description Ư¼ºÀ» ÀÌ¿ëÇϸé Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ¿¡ °üÇÑ ÀÚ¼¼ÇÑ »çÇ×Àº Python Database API 2.0 ¹®¼¸¦ Âü°íÇϱ⠹ٶõ´Ù. for¹®¿¡¼ °¢ ·¹ÄÚµå ´ÜÀ§·Î Á¤º¸°¡ »çÀü Çü½ÄÀ¸·Î entry¿¡ ÀúÀåµÇ°í, ±× »çÀüÀº ´Ù½Ã entries ¸®½ºÆ®¿¡ Ãß°¡µÈ´Ù. ¸¶Áö¸· for¹®Àº ÀúÀåµÈ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. µ¥ÀÌÅͺ£À̽º¸¦ ´Ù·ç´Â °Í¿¡ ´ëÇØ¼ ÃæºÐÇÏ°Ô ´Ù·çÁö´Â ¸øÇßÁö¸¸ CGI¿Í ¿¬°áÇØ¼ ´Ù·ê ¸¸ÅÀÇ ±âÃÊ´Â ÃæºÐÇÏ´Ù°í »ý°¢µÈ´Ù. ¾ÕÀ¸·Î ¹®¼°¡ °»½ÅµÈ´Ù¸é Á»´õ ÀÚ¼¼ÇÏ°Ô µ¥ÀÌÅͺ£À̽º¸¦ ´Ù·ç´Â ·çƾÀ» ¼Ò°³ÇϰڴÙ.
ÀÌ 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',
Á»´õ ǰÀ§ ÀÖ°Ô Á¤º¸¸¦ Ãâ·ÂÇÏ·Á¸é ´ÙÀ½°ú °°Àº Äڵ带 ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. 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
¶Ç´Â ´ÙÀ½°ú °°ÀÌ Çϳª¾¿ Ãâ·ÂÇÒ ¼öµµ ÀÖ´Ù. À§¿Í °°Àº Ãâ·ÂÀ» ¾òÀ» °ÍÀÌ´Ù. 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
|