(+84) 236.3827111 ex. 402

Kỹ thuật lập trình CGI trong Python (tt)


Truyền thông tin bởi sử dụng phương thức GET

Phương thức GET gửi thông tin người dùng đã mã hóa được phụ thêm tới yêu cầu trang. Trang và thông tin mã hóa được phân biệt bởi ký tự ? như sau:

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

Phương thức GET là phương thức mặc định để truyền thông tin từ trình duyệt tới Web Server và nó tạo ra một chuỗi dài xuất hiện trong Location:box của trình duyệt.

Nếu bạn có password hoặc bất cú thông tin nhạy cảm nào khác cần truyền tới Server thì bạn đừng bao giờ sử dụng phương thức GET. Phương thức GET có giới hạn kích cỡ: chỉ có 1024 ký tự có thể được gửi trong một chuỗi yêu cầu. Phương thức GET gửi thông tin bởi QUERY_STRING Header và sẽ là có thể truy cập trong chương trìn CGI thông qua biến môi trường QUERY_STRING.

Bạn có thể truyền thông tin bằng cách đơn giản là nối chuỗi các cặp key và value cùng với bất cứ URL nào hoặc bạn có thể sử dụng thẻ form trong HTML.

Phương thức GET: Ví dụ URL đơn giản

URL đơn giản sau sẽ truyền hai giá trị tới chương trình hello_get.py bởi sử dụng phương thức GET.

/cgi-bin/hello_get.py?first_name=HOANG&last_name=NGUYEN

Dưới đây là hello_get.py để xử lý đầu vào đã được cung cấp bởi trình duyệt web. Chúng ta đang sử dụng cgi Module giúp cho việc truy cập thông tin đã truyền được dễ dàng hơn.

 

# Import cac module de xu ly CGI 
import cgi, cgitb 

# Tao instance cua FieldStorage 
form = cgi.FieldStorage() 

# Lay du lieu tu cac truong
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Chuong trinh CGI thu hai"
print ""
print ""
print "

Hello %s %s

"
% (first_name, last_name) print "" print ""

Phương thức GET: Ví dụ FORM đơn giản

Ví dụ sau sẽ truyền hai giá trị bởi sử dụng HTML form và nút submit. Chúng ta sử dụng hello_get.py giống như trên để xử lý đầu vào này.

<> action="/cgi-bin/hello_get.py" method="get">
First Name: <> type="text" name="first_name">  <> />

Last Name: <> type="text" name="last_name" />
<> type="submit" value="Submit" />

Truyền thông tin bởi sử dụng phương thức POST

Một phương thức đáng tin cậy hơn để truyền thông tin tới một chương trình CGI là phương thức POST. Phương thức này đóng gói thông tin theo đúng như cách của phương thức GET, nhưng thay vì gửi nó dưới dạng một chuỗi text sau một dấu ? trong URL, thì nó gửi dưới dạng một thông điệp riêng rẽ. Thông điệp này vào trong CGI script trong dạng đầu vào chuẩn.

Ví dụ sau cũng sử dụng hello_get.py ở trên.

 

# Import cac module de xu ly CGI 
import cgi, cgitb 

# Tao instance cua FieldStorage 
form = cgi.FieldStorage() 

# Lay du lieu tu cac truong
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Chuong trinh CGI thu hai"
print ""
print ""
print "

Hello %s %s

"
% (first_name, last_name) print "" print ""

Sử dụng lại ví dụ trên để truyền hai giá trị bởi sử dụng HTML form và nút submit.

<> action="/cgi-bin/hello_get.py" method="post">
First Name: <> type="text" name="first_name"><> />
Last Name: <> type="text" name="last_name" />

<> type="submit" value="Submit" />

Truyền Checkbox tới chương trình CGI

HTML code sau là cho một form với hai checkbox:

<> action="/cgi-bin/checkbox.cgi" method="POST" target="_blank">
<> type="checkbox" name="toan" value="on" /> Toan
<> type="checkbox" name="vatly" value="on" /> VatLy
<> type="submit" value="Chon Mon Hoc" />

Dưới đây là checkbox.cgi để xử lý đầu vào được cung cấp bởi trình duyệt web:

 

# Import cac module de xu ly CGI 
import cgi, cgitb 

# Tao instance cua FieldStorage 
form = cgi.FieldStorage() 

# Lay du lieu tu cac truong
if form.getvalue('toan'):
   toan_flag = "ON"
else:
   toan_flag = "OFF"

if form.getvalue('vatly'):
   vatly_flag = "ON"
else:
   vatly_flag = "OFF"

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Vi du Checkbox"
print ""
print ""
print "

Mon Toan la : %s

"
% toan_flag print "

Mon Vat Ly la : %s

"
% vatly_flag print "" print ""

Truyền RadioButton tới chương trình CGI

HTML code sau cho một form với hai Radiobutton:

<> action="/cgi-bin/radiobutton.py" method="post" target="_blank">
<> type="radio" name="subject" value="toan" /> Toan
<> type="radio" name="subject" value="vatly" /> VatLy
<> type="submit" value="Chon Mon Hoc" />

Và đây là radiobutton.py để xử lý đầu vào được cung cấp bởi trình duyệt web:

 

# Import cac module de xu ly CGI 
import cgi, cgitb 

# Tao instance cua FieldStorage 
form = cgi.FieldStorage() 

# Lay du lieu tu cac truong
if form.getvalue('subject'):
   subject = form.getvalue('subject')
else:
   subject = "Khong duoc thiet lap"

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Vi du Radio button"
print ""
print ""
print "

Mon hoc ban da chon la %s

"
% subject print "" print ""

Ví dụ File Upload

Để upload một file, HTML form phải có thuộc tính enctype được thiết lập thành multipart/form-data.



   <> enctype="multipart/form-data" 
                     action="save_file.py" method="post">
   

File: <> type="file" name="filename" />

<>

type="submit" value="Upload" />

Dưới đây là save_file.py để xử lý file upload:

 

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# Lay ten file o day.
fileitem = form['filename']

# Kiem tra xem file da duoc upload chua
if fileitem.filename:
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = 'File co ten la "' + fn + '" duoc upload thanh cong'
   
else:
   message = 'Khong co file nao duoc upload'
   
print """\
Content-Type: text/html\n


   

%s

"""
% (message,)

Sử dụng Cookie

Cookie là bản ghi dữ liệu thuần text của 5 trường biến sau:

  • Expires: Ngày cookie sẽ hết hạn. Nếu là trống, thì cookie sẽ hết hạn khi khách truy cập thoát khỏi trình duyệt.

  • Domain: Tên miền của site của bạn.

  • Path: Path tới thuc mục hoặc trang web mà thiết lập cookie. Nó có thể là trống nếu bạn muốn thu nhận cookie từ bất kỳ thư mục hoặc trang nào.

  • Secure: Nếu trường này chứa từ secure, thì cookie có thể chỉ được thu nhận bởi một server an toàn. Nếu để trống, thì không tồn tại giới hạn nào.

  • Name=Value: Cookie được thiết lập và thu nhận trong dạng các cặp key-value.

Thiết lập cookie

Để gửi cookie tới trình duyệt là khá dễ dàng. Các cookie này được gửi cùng với HTTP Header, ở trước trường Content-type. Giả sử bạn muốn thiết lập UserID và Password là các cookie, thì việc này được thực hiện như sau:

 

print "Set-Cookie:UserID=XYZ;\r\n"
print "Set-Cookie:Password=XYZ123;\r\n"
print "Set-Cookie:Expires=Tuesday, 31-Nov-2015 23:12:40 GMT";\r\n"
print "Set-Cookie:Domain=www.vietjack.com;\r\n"
print "Set-Cookie:Path=/perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....

Qua ví dụ trên, bạn có thể thấy rằng chúng ta đã sử dụng trường Set-Cookie để thiết lập các cookie. Việc thiết lập các thuộc tính của cookie như Expires, Domain, Path là tùy ý. Bạn cần chú ý là các cookie được thiết lập trước khi gửi trường "Content-type:text/html\r\n\r\n.

Thu nhận Cookie

Để thu nhận tất cả các Cookie đã thiết lập là khá dễ dàng. Các cookie được lưu trữ trong biến môi trường HTTP_COOKIE của CGI và có dạng sau:

key1=value1;key2=value2;key3=value3....

Dưới đây là ví dụ đơn giản minh họa cách thu nhận các cookie:

 

# Import cac module de xu ly CGI 
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 "Ten dang nhap = %s" % user_id print "Mat khau = %s" % password