หลังจากที่ผมหาข้อมูลอยู่นาน ผมพบว่า Mod_python เป็น Mod ที่ใช้สำหรับเรียกใช้งาน Python กับ Mod_python แต่ปัจจุบันได้ยุติการสนับสนุนไปแล้ว แต่ยังพอมีวิธีตั้งค่า Python กับ Apache ครับ ก่อนจะเริ่มเขียน CGI ใน Python ให้ผู้อ่านตั้งค่า Apache ก่อนครับ
Windows
ตั้งค่า Pyhon กับ Apache บน Windows
- ติดตั้ง Python โดยโหลดจาก http://python.org/download/
- ตั้งค่า 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 ให้เปลี่ยนเป็นรุ่นของ Python ที่ผู้อ่านใช้งาน แล้วบันทึกในโฟลเดอร์ htdocs เข้าไปที่ http://localhost/test.py จะได้ผลลัพธ์ Hello World!#!C:\Python34\python.exe print("Content-Type: text/plain;charset=utf-8") print() print("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 ใน Pythonprint("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 แล้วข้อมูลจากไปปรากฏที่ไฟล์ .py โดยส่งค่าเป็น GET
ถ้าเป็น 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 ความคิดเห็น:
แสดงความคิดเห็น
แสดงความคิดเห็นได้ครับ :)