Python 3 - การเขียนโปรแกรม CGI
Common Gateway Interface หรือ CGI เป็นชุดของมาตรฐานที่กำหนดวิธีการแลกเปลี่ยนข้อมูลระหว่างเว็บเซิร์ฟเวอร์และสคริปต์ที่กำหนดเอง ข้อมูลจำเพาะ CGI ได้รับการดูแลโดย NCSA
CGI คืออะไร?
Common Gateway Interface หรือ CGI เป็นมาตรฐานสำหรับโปรแกรมเกตเวย์ภายนอกเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ข้อมูลเช่นเซิร์ฟเวอร์ HTTP
เวอร์ชันปัจจุบันคือ CGI / 1.1 และ CGI / 1.2 อยู่ระหว่างการดำเนินการ
การท่องเว็บ
เพื่อทำความเข้าใจแนวคิดของ CGI ให้เราดูว่าเกิดอะไรขึ้นเมื่อเราคลิกไฮเปอร์ลิงก์เพื่อเรียกดูหน้าเว็บหรือ URL ที่ต้องการ
เบราว์เซอร์ของคุณติดต่อกับเว็บเซิร์ฟเวอร์ HTTP และต้องการ URL เช่นชื่อไฟล์
เว็บเซิร์ฟเวอร์แยกวิเคราะห์ URL และค้นหาชื่อไฟล์ หากพบไฟล์นั้นให้ส่งกลับไปที่เบราว์เซอร์มิฉะนั้นจะส่งข้อความแสดงข้อผิดพลาดที่ระบุว่าคุณร้องขอไฟล์ผิด
เว็บเบราว์เซอร์รับการตอบสนองจากเว็บเซิร์ฟเวอร์และแสดงไฟล์ที่ได้รับหรือข้อความแสดงข้อผิดพลาด
อย่างไรก็ตามเป็นไปได้ที่จะตั้งค่าเซิร์ฟเวอร์ HTTP ดังนั้นเมื่อใดก็ตามที่มีการร้องขอไฟล์ในไดเร็กทอรีหนึ่งไฟล์จะไม่ถูกส่งกลับ แทนที่จะเรียกใช้งานเป็นโปรแกรมและสิ่งใดก็ตามที่เอาต์พุตของโปรแกรมจะถูกส่งกลับเพื่อให้เบราว์เซอร์ของคุณแสดง ฟังก์ชันนี้เรียกว่า Common Gateway Interface หรือ CGI และโปรแกรมเรียกว่าสคริปต์ CGI โปรแกรม CGI เหล่านี้สามารถเป็น Python Script, PERL Script, Shell Script, C หรือ C ++ เป็นต้น
แผนภาพสถาปัตยกรรม CGI
การสนับสนุนและกำหนดค่าเว็บเซิร์ฟเวอร์
ก่อนที่คุณจะดำเนินการเขียนโปรแกรม CGI ตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์ของคุณรองรับ CGI และได้รับการกำหนดค่าให้จัดการกับโปรแกรม CGI โปรแกรม CGI ทั้งหมดที่จะเรียกใช้โดยเซิร์ฟเวอร์ HTTP จะถูกเก็บไว้ในไดเร็กทอรีที่กำหนดค่าไว้ล่วงหน้า ไดเร็กทอรีนี้เรียกว่า CGI Directory และตามแบบแผนจะมีชื่อว่า / var / www / cgi-bin ตามแบบแผนไฟล์ CGI มีนามสกุลเป็น.cgi, แต่คุณสามารถเก็บไฟล์ของคุณด้วยนามสกุล python .py เช่นกัน.
ตามค่าเริ่มต้นเซิร์ฟเวอร์ Linux ถูกกำหนดค่าให้รันเฉพาะสคริปต์ในไดเร็กทอรี cgi-bin ใน / var / www หากคุณต้องการระบุไดเร็กทอรีอื่นเพื่อรันสคริปต์ CGI ของคุณให้คอมเมนต์บรรทัดต่อไปนี้ในไฟล์ httpd.conf -
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
ในที่นี้เราถือว่าคุณมี Web Server และทำงานได้สำเร็จและคุณสามารถรันโปรแกรม CGI อื่น ๆ เช่น Perl หรือ Shell เป็นต้น
โปรแกรม CGI ครั้งแรก
นี่คือลิงค์ที่เรียบง่ายซึ่งจะเชื่อมโยงไปยังสคริปต์ CGI เรียกhello.py ไฟล์นี้ถูกเก็บไว้ในไดเร็กทอรี / var / www / cgi-bin และมีเนื้อหาดังต่อไปนี้ ก่อนเรียกใช้โปรแกรม CGI ของคุณตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนโหมดของไฟล์โดยใช้ไฟล์chmod 755 hello.py คำสั่ง UNIX เพื่อทำให้ไฟล์เรียกทำงานได้
#!/usr/bin/python
print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')
Note- บรรทัดแรกในสคริปต์ต้องเป็นพา ธ ไปยังไฟล์ปฏิบัติการ Python ใน Linux ควรเป็น #! / usr / bin / python3
ป้อน URL ต่อไปนี้ในเบราว์เซอร์ของคุณ
http://localhost:8080/cgi-bin/hello.py
Hello Word! This is my first CGI program
สคริปต์ hello.py นี้เป็นสคริปต์ Python แบบธรรมดาซึ่งเขียนผลลัพธ์ในไฟล์ STDOUT นั่นคือหน้าจอ มีคุณลักษณะที่สำคัญและพิเศษอย่างหนึ่งซึ่งเป็นบรรทัดแรกที่จะพิมพ์Content-type:text/html\r\n\r\n. บรรทัดนี้ถูกส่งกลับไปที่เบราว์เซอร์และระบุประเภทเนื้อหาที่จะแสดงบนหน้าจอเบราว์เซอร์
ตอนนี้คุณต้องเข้าใจแนวคิดพื้นฐานของ CGI และคุณสามารถเขียนโปรแกรม CGI ที่ซับซ้อนได้โดยใช้ Python สคริปต์นี้สามารถโต้ตอบกับระบบภายนอกอื่น ๆ เพื่อแลกเปลี่ยนข้อมูลเช่น RDBMS
ส่วนหัว HTTP
เส้น Content-type:text/html\r\n\r\nเป็นส่วนหนึ่งของส่วนหัว HTTP ซึ่งส่งไปยังเบราว์เซอร์เพื่อทำความเข้าใจเนื้อหา ส่วนหัว HTTP ทั้งหมดจะอยู่ในรูปแบบต่อไปนี้ -
HTTP Field Name: Field Content
For Example
Content-type: text/html\r\n\r\n
มีส่วนหัว HTTP ที่สำคัญอื่น ๆ อีกเล็กน้อยซึ่งคุณจะใช้บ่อยในการเขียนโปรแกรม CGI ของคุณ
ซีเนียร์ | ส่วนหัวและคำอธิบาย |
---|---|
1 | Content-type: สตริง MIME ที่กำหนดรูปแบบของไฟล์ที่ส่งคืน ตัวอย่างคือ Content-type: text / html |
2 | Expires: Date วันที่ข้อมูลไม่ถูกต้อง เบราว์เซอร์ใช้เพื่อตัดสินใจว่าจะต้องรีเฟรชหน้าเมื่อใด สตริงวันที่ที่ถูกต้องอยู่ในรูปแบบ 01 มกราคม 1998 12:00:00 GMT |
3 | Location: URL URL ที่ส่งคืนแทน URL ที่ร้องขอ คุณสามารถใช้ฟิลด์นี้เพื่อเปลี่ยนเส้นทางคำขอไปยังไฟล์ใดก็ได้ |
4 | Last-modified: Date วันที่แก้ไขทรัพยากรครั้งล่าสุด |
5 | Content-length: N ความยาวเป็นไบต์ของข้อมูลที่ส่งคืน เบราว์เซอร์ใช้ค่านี้เพื่อรายงานเวลาดาวน์โหลดโดยประมาณสำหรับไฟล์ |
6 | Set-Cookie: String ตั้งค่าคุกกี้ที่ส่งผ่านสตริง |
ตัวแปรสภาพแวดล้อม CGI
โปรแกรม CGI ทั้งหมดสามารถเข้าถึงตัวแปรสภาพแวดล้อมต่อไปนี้ ตัวแปรเหล่านี้มีบทบาทสำคัญในขณะที่เขียนโปรแกรม CGI
ซีเนียร์ | ชื่อตัวแปรและคำอธิบาย |
---|---|
1 | CONTENT_TYPE ชนิดข้อมูลของเนื้อหา ใช้เมื่อไคลเอ็นต์ส่งเนื้อหาที่แนบไปยังเซิร์ฟเวอร์ ตัวอย่างเช่นการอัปโหลดไฟล์ |
2 | CONTENT_LENGTH ความยาวของข้อมูลแบบสอบถาม มีให้สำหรับคำขอ POST เท่านั้น |
3 | HTTP_COOKIE ส่งคืนชุดคุกกี้ในรูปแบบของคู่คีย์และค่า |
4 | HTTP_USER_AGENT ฟิลด์ User-Agent request-header มีข้อมูลเกี่ยวกับตัวแทนผู้ใช้ที่มาจากคำร้องขอ เป็นชื่อของเว็บเบราว์เซอร์ |
5 | PATH_INFO เส้นทางสำหรับสคริปต์ CGI |
6 | QUERY_STRING ข้อมูลที่เข้ารหัส URL ที่ส่งมาพร้อมกับการร้องขอเมธอด GET |
7 | REMOTE_ADDR ที่อยู่ IP ของโฮสต์ระยะไกลที่ทำการร้องขอ นี่คือการบันทึกที่มีประโยชน์หรือสำหรับการตรวจสอบสิทธิ์ |
8 | REMOTE_HOST ชื่อแบบเต็มของโฮสต์ที่ทำการร้องขอ หากไม่มีข้อมูลนี้คุณสามารถใช้ REMOTE_ADDR เพื่อรับที่อยู่ IR ได้ |
9 | REQUEST_METHOD วิธีการที่ใช้ในการร้องขอ วิธีการทั่วไปคือ GET และ POST |
10 | SCRIPT_FILENAME เส้นทางแบบเต็มไปยังสคริปต์ CGI |
11 | SCRIPT_NAME ชื่อของสคริปต์ CGI |
12 | SERVER_NAME ชื่อโฮสต์หรือที่อยู่ IP ของเซิร์ฟเวอร์ |
13 | SERVER_SOFTWARE ชื่อและเวอร์ชันของซอฟต์แวร์ที่เซิร์ฟเวอร์กำลังเรียกใช้ |
นี่คือโปรแกรม CGI ขนาดเล็กเพื่อแสดงรายการตัวแปร CGI ทั้งหมด คลิกลิงก์นี้เพื่อดูผลลัพธ์รับสภาพแวดล้อม
#!/usr/bin/python
import os
print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))
รับและโพสต์วิธีการ
คุณต้องเจอสถานการณ์ต่างๆมากมายเมื่อคุณต้องส่งข้อมูลบางอย่างจากเบราว์เซอร์ของคุณไปยังเว็บเซิร์ฟเวอร์และท้ายที่สุดไปยังโปรแกรม CGI ของคุณ บ่อยที่สุดเบราว์เซอร์ใช้สองวิธีสองวิธีส่งข้อมูลนี้ไปยังเว็บเซิร์ฟเวอร์ วิธีการเหล่านี้คือ GET Method และ POST Method
การส่งผ่านข้อมูลโดยใช้วิธี GET
เมธอด GET จะส่งข้อมูลผู้ใช้ที่เข้ารหัสต่อท้ายคำขอเพจ หน้าและข้อมูลที่เข้ารหัสจะถูกคั่นด้วยเครื่องหมาย? ตัวละครดังนี้ -
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
เมธอด GET เป็นวิธีการเริ่มต้นในการส่งผ่านข้อมูลจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์และสร้างสตริงแบบยาวที่ปรากฏในกล่องตำแหน่ง: ของเบราว์เซอร์ของคุณ
อย่าใช้เมธอด GET หากคุณมีรหัสผ่านหรือข้อมูลที่ละเอียดอ่อนอื่น ๆ เพื่อส่งผ่านไปยังเซิร์ฟเวอร์
เมธอด GET มีการ จำกัด ขนาด: สามารถส่งอักขระได้ 1024 ตัวในสตริงคำขอเท่านั้น
เมธอด GET จะส่งข้อมูลโดยใช้ส่วนหัว QUERY_STRING และสามารถเข้าถึงได้ในโปรแกรม CGI ของคุณผ่านตัวแปรสภาพแวดล้อม QUERY_STRING
คุณสามารถส่งผ่านข้อมูลได้เพียงแค่เชื่อมคู่คีย์และค่าร่วมกับ URL ใด ๆ หรือคุณสามารถใช้แท็ก HTML <FORM> เพื่อส่งผ่านข้อมูลโดยใช้เมธอด GET
ตัวอย่าง URL แบบง่าย: รับวิธีการ
นี่คือ URL แบบง่ายซึ่งส่งผ่านค่าสองค่าไปยังโปรแกรม hello_get.py โดยใช้เมธอด GET
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALIด้านล่างนี้คือ hello_get.pyสคริปต์เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์ เรากำลังจะใช้cgi โมดูลซึ่งทำให้ง่ายต่อการเข้าถึงข้อมูลที่ส่งผ่าน -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ("</body>")
print ("</html>")
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
Hello ZARA ALI
ตัวอย่างแบบฟอร์มอย่างง่าย: GET Method
ตัวอย่างนี้ส่งผ่านค่าสองค่าโดยใช้รูปแบบ HTML และปุ่มส่ง เราใช้สคริปต์ CGI เดียวกัน hello_get.py เพื่อจัดการอินพุตนี้
<form action = "/cgi-bin/hello_get.py" method = "get">
First Name: <input type = "text" name = "first_name"> <br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
นี่คือผลลัพธ์ที่แท้จริงของแบบฟอร์มด้านบนคุณป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์
การส่งข้อมูลโดยใช้วิธี POST
วิธีการส่งข้อมูลไปยังโปรแกรม CGI ที่น่าเชื่อถือกว่าโดยทั่วไปคือวิธีการโพสต์ ข้อมูลนี้จะบรรจุข้อมูลในลักษณะเดียวกับเมธอด GET แต่แทนที่จะส่งเป็นสตริงข้อความหลังจาก a? ใน URL จะส่งเป็นข้อความแยกต่างหาก ข้อความนี้มาในสคริปต์ CGI ในรูปแบบของอินพุตมาตรฐาน
ด้านล่างนี้คือสคริปต์ hello_get.py เดียวกับที่จัดการ GET และวิธีการ POST
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"
ให้เราใช้ตัวอย่างเดียวกับด้านบนอีกครั้งซึ่งส่งผ่านค่าสองค่าโดยใช้ HTML FORM และปุ่มส่ง เราใช้สคริปต์ CGI เดียวกัน hello_get.py เพื่อจัดการอินพุตนี้
<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
นี่คือผลลัพธ์จริงของแบบฟอร์มด้านบน คุณป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์
การส่งข้อมูลช่องทำเครื่องหมายไปยังโปรแกรม CGI
ช่องทำเครื่องหมายถูกใช้เมื่อจำเป็นต้องเลือกมากกว่าหนึ่งตัวเลือก
นี่คือตัวอย่างโค้ด HTML สำหรับฟอร์มที่มีช่องทำเครื่องหมายสองช่อง -
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้คือสคริปต์ checkbox.cgi เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดสำหรับปุ่มช่องทำเครื่องหมาย
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('maths'):
math_flag = "ON"
else:
math_flag = "OFF"
if form.getvalue('physics'):
physics_flag = "ON"
else:
physics_flag = "OFF"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"
การส่งผ่านข้อมูลปุ่มตัวเลือกไปยังโปรแกรม CGI
ปุ่มวิทยุจะใช้เมื่อต้องเลือกเพียงตัวเลือกเดียว
นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีปุ่มตัวเลือกสองปุ่ม -
<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
<input type = "radio" name = "subject" value = "maths" /> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้คือสคริปต์ radiobutton.py เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดสำหรับปุ่มตัวเลือก -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('subject'):
subject = form.getvalue('subject')
else:
subject = "Not set"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
การส่งผ่านข้อมูลพื้นที่ข้อความไปยังโปรแกรม CGI
องค์ประกอบ TEXTAREA ถูกใช้เมื่อต้องส่งข้อความหลายบรรทัดไปยังโปรแกรม CGI
นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีกล่อง TEXTAREA -
<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้คือสคริปต์ textarea.cgi เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์ -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('textcontent'):
text_content = form.getvalue('textcontent')
else:
text_content = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"
การส่งผ่านข้อมูลแบบหล่นลงไปยังโปรแกรม CGI
Drop Down Box ใช้เมื่อเรามีตัวเลือกมากมาย แต่จะเลือกเพียงหนึ่งหรือสองตัวเท่านั้น
นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีช่องแบบเลื่อนลง -
<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้คือสคริปต์ dropdown.py เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('dropdown'):
subject = form.getvalue('dropdown')
else:
subject = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
การใช้คุกกี้ใน CGI
โปรโตคอล HTTP เป็นโปรโตคอลไร้สัญชาติ สำหรับเว็บไซต์เชิงพาณิชย์จำเป็นต้องดูแลรักษาข้อมูลเซสชันระหว่างหน้าต่างๆ ตัวอย่างเช่นการลงทะเบียนผู้ใช้หนึ่งคนจะสิ้นสุดลงหลังจากเสร็จสิ้นหลายหน้า จะรักษาข้อมูลเซสชันของผู้ใช้ในทุกหน้าเว็บได้อย่างไร?
ในหลาย ๆ สถานการณ์การใช้คุกกี้เป็นวิธีที่มีประสิทธิภาพที่สุดในการจดจำและติดตามการตั้งค่าการซื้อค่าคอมมิชชั่นและข้อมูลอื่น ๆ ที่จำเป็นสำหรับประสบการณ์ของผู้เยี่ยมชมหรือสถิติไซต์
มันทำงานอย่างไร?
เซิร์ฟเวอร์ของคุณส่งข้อมูลบางส่วนไปยังเบราว์เซอร์ของผู้เยี่ยมชมในรูปแบบของคุกกี้ เบราว์เซอร์อาจยอมรับคุกกี้ หากเป็นเช่นนั้นระบบจะจัดเก็บเป็นบันทึกข้อความธรรมดาในฮาร์ดไดรฟ์ของผู้เยี่ยมชม ตอนนี้เมื่อผู้เยี่ยมชมเข้ามาที่หน้าอื่นในไซต์ของคุณคุกกี้จะพร้อมสำหรับการเรียกคืน เมื่อดึงข้อมูลเซิร์ฟเวอร์ของคุณจะรู้ / จำสิ่งที่เก็บไว้
คุกกี้คือบันทึกข้อมูลข้อความธรรมดาของฟิลด์ความยาวตัวแปร 5 ช่อง -
Expires- วันที่คุกกี้จะหมดอายุ หากว่างเปล่าคุกกี้จะหมดอายุเมื่อผู้เยี่ยมชมออกจากเบราว์เซอร์
Domain - ชื่อโดเมนของไซต์ของคุณ
Path- เส้นทางไปยังไดเร็กทอรีหรือเว็บเพจที่ตั้งค่าคุกกี้ ซึ่งอาจว่างเปล่าหากคุณต้องการดึงคุกกี้จากไดเร็กทอรีหรือเพจใด ๆ
Secure- หากช่องนี้มีคำว่า "ปลอดภัย" คุกกี้จะถูกเรียกคืนด้วยเซิร์ฟเวอร์ที่ปลอดภัยเท่านั้น หากฟิลด์นี้ว่างแสดงว่าไม่มีข้อ จำกัด ดังกล่าว
Name = Value - คุกกี้ถูกตั้งค่าและเรียกดูในรูปแบบของคู่คีย์และค่า
การตั้งค่าคุกกี้
การส่งคุกกี้ไปยังเบราว์เซอร์นั้นง่ายมาก คุกกี้เหล่านี้จะถูกส่งไปพร้อมกับ HTTP Header ก่อนไปยังฟิลด์ Content-type สมมติว่าคุณต้องการตั้งค่า UserID และรหัสผ่านเป็นคุกกี้ การตั้งค่าคุกกี้ทำได้ดังนี้ -
#!/usr/bin/python
print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....
จากตัวอย่างนี้คุณต้องเข้าใจวิธีตั้งค่าคุกกี้ เราใช้Set-Cookie HTTP header เพื่อตั้งค่าคุกกี้
เป็นทางเลือกในการตั้งค่าแอตทริบิวต์คุกกี้เช่น Expires, Domain และ Path เป็นที่น่าสังเกตว่าคุกกี้จะถูกตั้งค่าก่อนที่จะส่งสายเวทย์มนตร์"Content-type:text/html\r\n\r\n.
การดึงคุกกี้
มันง่ายมากที่จะดึงคุกกี้ชุดทั้งหมด คุกกี้จะถูกเก็บไว้ในตัวแปรสภาพแวดล้อม CGI HTTP_COOKIE และจะมีรูปแบบต่อไปนี้ -
key1 = value1;key2 = value2;key3 = value3....
นี่คือตัวอย่างวิธีการดึงข้อมูลคุกกี้
#!/usr/bin/python
# Import modules for CGI handling
from os import environ
import cgi, cgitb
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
print "User ID = %s" % user_id
print "Password = %s" % password
สิ่งนี้ก่อให้เกิดผลลัพธ์ต่อไปนี้สำหรับคุกกี้ที่กำหนดโดยสคริปต์ด้านบน -
User ID = XYZ
Password = XYZ123
ตัวอย่างการอัปโหลดไฟล์
ในการอัปโหลดไฟล์รูปแบบ HTML ต้องมีแอตทริบิวต์ enctype ตั้งค่าเป็น multipart/form-data. แท็กอินพุตที่มีประเภทไฟล์จะสร้างปุ่ม "เรียกดู"
<html>
<body>
<form enctype = "multipart/form-data" action = "save_file.py" method = "post">
<p>File: <input type = "file" name = "filename" /></p>
<p><input type = "submit" value = "Upload" /></p>
</form>
</body>
</html>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ตัวอย่างด้านบนถูกปิดใช้งานโดยเจตนาเพื่อบันทึกผู้ที่อัปโหลดไฟล์บนเซิร์ฟเวอร์ของเรา แต่คุณสามารถลองใช้โค้ดด้านบนกับเซิร์ฟเวอร์ของคุณได้
นี่คือสคริปต์ save_file.py เพื่อจัดการการอัปโหลดไฟล์ -
#!/usr/bin/python
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
# Get filename here.
fileitem = form['filename']
# Test if the file was uploaded
if fileitem.filename:
# strip leading path from file name to avoid
# directory traversal attacks
fn = os.path.basename(fileitem.filename)
open('/tmp/' + fn, 'wb').write(fileitem.file.read())
message = 'The file "' + fn + '" was uploaded successfully'
else:
message = 'No file was uploaded'
print """\
Content-Type: text/html\n
<html>
<body>
<p>%s</p>
</body>
</html>
""" % (message,)
หากคุณเรียกใช้สคริปต์ข้างต้นบน Unix / Linux คุณต้องดูแลการเปลี่ยนตัวคั่นไฟล์ดังต่อไปนี้มิฉะนั้นบนเครื่อง windows ของคุณเหนือคำสั่ง open () ควรทำงานได้ดี
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
วิธีเพิ่มกล่องโต้ตอบ "ดาวน์โหลดไฟล์"
บางครั้งคุณต้องการให้ตัวเลือกที่ผู้ใช้สามารถคลิกลิงก์และจะปรากฏกล่องโต้ตอบ "ดาวน์โหลดไฟล์" ให้กับผู้ใช้แทนที่จะแสดงเนื้อหาจริง นี่เป็นเรื่องง่ายมากและสามารถทำได้ผ่านส่วนหัว HTTP ส่วนหัว HTTP นี้แตกต่างจากส่วนหัวที่กล่าวถึงในส่วนก่อนหน้า
ตัวอย่างเช่นหากคุณต้องการสร้างไฟล์ FileName ดาวน์โหลดไฟล์ได้จากลิงค์ที่กำหนดจากนั้นไวยากรณ์จะเป็นดังนี้ -
#!/usr/bin/python
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go here.
fo = open("foo.txt", "rb")
str = fo.read();
print str
# Close opend file
fo.close()
หวังว่าคุณจะสนุกกับบทช่วยสอนนี้ ถ้าใช่โปรดส่งข้อเสนอแนะของคุณมาที่: ติดต่อเรา