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()

หวังว่าคุณจะสนุกกับบทช่วยสอนนี้ ถ้าใช่โปรดส่งข้อเสนอแนะของคุณมาที่: ติดต่อเรา