2 พฤศจิกายน 2557

Published 11/02/2557 by with 0 comment

ใช้ CGI ใน Python และวิธีตั้งค่ากับ Apache

สวัสดีทุกท่านครับ บทความนี้จะพาทุกท่านไปลองเขียน CGI ใน Python และวิธีตั้งค่าเรียกใช้งานกับ Apache ครับ ผมไม่ขอกล่าวว่า CGI คืออะไรครับ
หลังจากที่ผมหาข้อมูลอยู่นาน ผมพบว่า Mod_python เป็น Mod ที่ใช้สำหรับเรียกใช้งาน Python กับ Mod_python แต่ปัจจุบันได้ยุติการสนับสนุนไปแล้ว แต่ยังพอมีวิธีตั้งค่า Python กับ Apache ครับ ก่อนจะเริ่มเขียน CGI ใน Python ให้ผู้อ่านตั้งค่า Apache ก่อนครับ

Windows

ตั้งค่า Pyhon กับ Apache บน Windows

  1. ติดตั้ง Python โดยโหลดจาก http://python.org/download/
  2. ตั้งค่า Apache เพื่อเรียกใช้งาน Python CGI
    ให้เปิดไฟล์ httpd.conf ที่อยู่ในโฟลเดอร์ conf ในโฟลเดอร์ย่อยของ  Apache ตัวอย่างเช่น “C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\”
    เข้าไปแล้วให้ค้นหา
    Options Indexes FollowSymLinks
    ให้เพิ่ม ExecCGI จะได้
    Options Indexes FollowSymLinks ExecCGI
    แต่สำหรับ Apache2.4 ขึ้นไปให้ใส่
    Options Indexes FollowSymLinks Includes ExecCGI
    ถัดไปให้ค้นหา
    #AddHandler cgi-script .cgi
    ให้ลบเครื่องหมาย # ออกแล้วเพิ่ม .py เข้าไป
    AddHandler cgi-script .cgi .py
    เสร็จแล้วบันทึกไฟล์ แล้ว Restart Apache
    เขียนโค้ดไฟล์ test.py
    #!C:\Python34\python.exe
    
    print("Content-Type: text/plain;charset=utf-8")
    print()
    print("Hello World!")
    ตรง C:\Python34\python.exe ให้เปลี่ยนเป็นรุ่นของ Python ที่ผู้อ่านใช้งาน แล้วบันทึกในโฟลเดอร์ htdocs เข้าไปที่ http://localhost/test.py จะได้ผลลัพธ์ Hello World!

XAMPP กับ Python 

สำหรับ XAMPP นักพัฒนาได้มีการเปิดใช้งาน CGI มาตั้งแต่ต้น สิ่งที่ต้องทำ
ให้เปิดไฟล์ httpd.conf แล้วค้นหา
AddHandler cgi-script .cgi .pl .asp
ให้เพิ่ม .py เข้าไปจะได้
AddHandler cgi-script .cgi .pl .asp .py
ให้บันทึกไฟล์เสร็จ Restart Apache แล้วลอง เขียนโค้ดไฟล์ test.py
#!C:\Python34\python.exe

print("Content-Type: text/plain;charset=utf-8")
print()
print("Hello World!")
ตรง C:\Python34\python.exe ให้เปลี่ยนเป็นรุ่นของ Python ที่ผู้อ่านใช้งาน แล้วบันทึกในโฟลเดอร์ htdocs เข้าไปที่ http://localhost/test.py จะได้ผลลัพธ์ Hello World!

Linux

สำหับ Linux สาย Debian เช่น Ubuntu

ให้ติดตั้ง  Apache กับ Python แล้ว ให้ใช้คำสั่งเปืดการเรียกใช้ CGI  โดยใช้คำสั่ง
sudo a2enmod cgi
จะนั้นให้เปิดไฟล์ conf ให้หา
<Directory /srv/www/yoursite/public_html/cgi-bin>
        Options ExecCGI
        SetHandler cgi-script
    </Directory>
แล้วเพิ่ม .py เข้าไปจะได้
    <Directory /srv/www/yoursite/public_html>
        Options +ExecCGI
        AddHandler cgi-script .py
    </Directory>
เสร็จแล้วบันทึกไฟล์ ลองเขียนโค้ด
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

print("Content-Type: text/plain;charset=utf-8")
print()
print("Hello World!")
ตรง #!/usr/bin/env python ผู้อ่านสามารถเปลี่ยนค่าได้ ตัวอย่างเช่น หากผู้อ่านใช้ Python 3 ให้เปลี่ยนเป็น #!/usr/bin/python3
แล้วบันทึกไฟล์ชื่อว่า test.py กำหนด chmod 755 แล้วลองเข้าไปที่ http://localhost/test.py จะได้ผลลัพธ์ Hello World!

เขียน CGI ด้วย Python

ตัวอย่างแรกของ CGI ใน Python
print("Content-Type: text/plain;charset=utf-8")
print()

print("Hello World!")

อธิบายโค้ด
บรรทัดที่ 1 ใช้ print ในการกำหนดชนิดของเนื้อหาเป็น HTML และกำหนดเป็น utf-8
บรรทัดที่ 4 ใช้ print แสดงผลลัพธ์เป็น Hello World!
ผู้อ่านสามารถใช้ Python ประยุกต์กับงานกับ HTML ด้วย CGI ได้ง่าย ๆ
ตัวอย่างที่ 2
import time
print("Content-Type: text/html\n\n")  #กำหนดรูปแบบเป็น html
timeStr = time.strftime("%c") #กำนหดค่า Time มีรูปแบบเป็น 11/02/14 08:59:54

htmlFormat = """
<html>
  <Title>The Time Now</Title>
<body>
  <p>The current Central date and time is:  {timeStr}</p>
</body>
</html> """

print(htmlFormat.format(**locals())) #ดึง timeStr มาใช้โดยแทน {timeStr} ที่มีค่าเป็น  %s

จะได้ผลลัพธ์
The current Central date and time is: 11/02/14 08:59:54
ต่อไปหากต้องการให้มีความสามารถเพิ่มเติมเช่น การรับค่าจากฟอร์ม HTML เป็นต้น ต้องเรียกใช้โมดูล cgi

GET และ POST Methods

ในการเขียน CGI การทำงานบางอย่าง ต้องมีการรับข้อมูลจาก Form มาประมวลผล ต้องใช้
  • ฟังก์ชั่น cgi.FieldStorage() มีการกำหนดที่เก็บข้อมูล Field 
  • ฟังก์ชั่น getvalue เพื่อรับค่าที่ได้จาก GET และ POST 
ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 3
ไฟล์ 3.py
#!C:\Python34\python.exe

import cgi
# กำนหนดค่าแทน FieldStorage 
form = cgi.FieldStorage() 

#รับข้อมูลจาก Field โดยเก็บค่าที่ได้ไว้ในตัวแปร name
name = form.getvalue('name')

print("Content-type:text/html\r\n\r\n")
print("<html>")
print("<head>")
print("<title>สวัสดี</title>")
print("</head>")
print("<body>")
print("<h2>สวัสดี %s</h2>" % (name))
print("</body>")
print("</html>")

ไฟล์ form.html
โค้ด:
<html>
  <Title>Form</Title>
<body>
<form action="3.py" method="get">
Name: <input type="text" name="name">  <br />
<input type="submit" value="Submit" />
</form>

เมื่อลองรันจะพบว่า form.html
เมื่อกรอกค่าใน Form แล้วข้อมูลจากไปปรากฏที่ไฟล์ .py โดยส่งค่าเป็น GET 3.py
ถ้าเป็น POST จะใช้หลักการเดียวกันครับ แต่ตรง method="get" ใน Form ต้องเปลี่ยนเป็น method="post" ครับ

Cookie

ในการใช้งาน  Cookie ใน Python CGI ต้องใช้ Set-Cookie ใน print ก่อนที่จะ Content-type ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 4
import time

print('Set-Cookie: lastvisit=' + str(time.time()))
print("Content-type:text/html\r\n\r\n")

จะได้ Cookie ที่มีชื่อว่า lastvisit โดยมีค่าเป็น time.time()) ตัวอย่างเช่น 1414903082.041233

อัปโหลดไฟล์

ในการอัปโหลดไฟล์ด้วย CGI กับ Python นั้นต้องมีการเขียนไฟล์ลงในโฟลเดอร์ ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 5
form.html
<html>
<body>
   <form enctype="multipart/form-data" action="5.py" method="post">
   <p>File: <input type="file" name="myfile" /></p>
   <p><input type="submit" value="Upload" /></p>
   </form>
</body>
</html>

5.py
#!C:\Python34\python.exe

import cgi
form_data = cgi.FieldStorage()
file_data = form_data['myfile']

fp =open('/file','wb')
fp.write(file_data)
fp.close()
ร่วมพูดคุยเกี่ยวกับการพัฒนาเว็บด้วย Python กันได้ที่ Python Web Developer
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)