Skip to content

ใช้ 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/htmlnn")  #กำหนดรูปแบบเป็น 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/htmlrnrn")
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/htmlrnrn")

จะได้ 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
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

Published on Categories web-developerTags

About wannaphong

วรรณพงษ์ ภัททิยไพบูลย์ ผู้ดูแลเว็บ wannaphong.com และผู้เขียนบทความบล็อกนี้ นักศึกษาชั้นปีที่ 1 สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์ มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *