Hướng dẫn python cgi html form - hình thức html cgi python

CGI (là viết tắt của Common Gateway Interface) là một tập hợp các chuẩn mà định nghĩa cách thông tin được trao đổi giữa Web Server và một Custom Script. Phiên bản CGI hiện tại là CGI/1.1.

Trước khi tiến hành lập trình CGI, bạn đảm bảo rằng Web Server của bạn hỗ trợ CGI và được cấu hình để xử lý các chương trình CGI

Cấu hình Web Server

Tất cả chương trình CGI được thực thi bởi HTTP đều được giữ trong một thư mục đã được cấu hình trước.

Thư mục này được gọi là CGI Directory và theo qui ước nó được đặt tên dạng /var/www/cgi-bin. Các CGI file có đuôi là .cgi, nhưng bạn cũng có thể giữ các file trong .py.

Theo mặc định, Linux Server được cấu hình để chạy các script trong thư mục cgi-bin trong /var/www. Nếu bạn muốn xác định bất kỳ thư mục nào khác để chạy CGI script của bạn, thì bạn comment các dòng sau trong httpd.conf file:


   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all



Options All

Chương trình CGI đầu tiên

Dưới đây là một CGI script có tên là hello.py, được giữ trong thư mục /var/www/cgi-bin. Trước khi chạy, bạn cần thay đổi mode của file này bởi sử dụng chmod 755 hello.py để làm file này có thể thực thi.

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''

Kết quả là:

Day la chuong trinh CGI dau tien trong Python

Đây là một Python script đơn giản để viết kết quả trên STDOUT chuẩn là màn hình. Dòng Content-type:text/html\r\n\r\n được gửi trở lại trình duyệt và nó xác định kiểu nội dung để được hiển thị trên màn hình trình duyệt.Content-type:text/html\r\n\r\n được gửi trở lại trình duyệt và nó xác định kiểu nội dung để được hiển thị trên màn hình trình duyệt.

HTTP Header

Dòng Content-type:text/html\r\n\r\n là một phần của HTTP Header mà được gửi tới trình duyệt để giúp trình duyệt hiểu nội dung cần được hiển thị. Tất cả HTTP Header sẽ là trong form sau:Content-type:text/html\r\n\r\n là một phần của HTTP Header mà được gửi tới trình duyệt để giúp trình duyệt hiểu nội dung cần được hiển thị. Tất cả HTTP Header sẽ là trong form sau:

HTTP Ten Truong: Noi Dung Cua Truong

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

Dưới đây là một số HTTP Header quan trọng khác mà bạn sẽ sử dụng thường xuyên trong lập trình CGI:

HeaderMiêu tả
Content-type: Một chuỗi MIME định nghĩa định dạng của file được trả về. Ví dụ Content-type:text/html
Expires: Date Ngày mà thông tin trở nên hết hiệu lực. Nó được sử dụng bởi trình duyệt để xác định khi nào trang cần được refresh. Một chuỗi date hợp lệ là trong định dạng 01 Jan 1998 12:00:00 GMT.
Location: URL URL mà được trả về thay cho URL đã được yêu cầu. Bạn có thể sử dụng trường này để chuyển hướng một yêu cầu tới bất kỳ file nào
Last-modified: Date Ngày sửa đổi cuối cùng của nguồn
Content-length: N Độ dài (số byte) của dữ liệu đang được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian download ước lượng cho một file
Set-Cookie: String Thiết lập cookie được truyền thông qua String

Các biến môi trường của CGI

Tất cả chương trình CGI có quyền truy cập tới các biến môi trường sau. Các biến này đóng một vai trò quan trọng trong khi viết bất cứ chương trình CGI nào.

Tên biếnMiêu tả
Content-type: Một chuỗi MIME định nghĩa định dạng của file được trả về. Ví dụ Content-type:text/html
Expires: Date Ngày mà thông tin trở nên hết hiệu lực. Nó được sử dụng bởi trình duyệt để xác định khi nào trang cần được refresh. Một chuỗi date hợp lệ là trong định dạng 01 Jan 1998 12:00:00 GMT.
Location: URL URL mà được trả về thay cho URL đã được yêu cầu. Bạn có thể sử dụng trường này để chuyển hướng một yêu cầu tới bất kỳ file nào
Last-modified: Date Ngày sửa đổi cuối cùng của nguồn
Content-length: N Độ dài (số byte) của dữ liệu đang được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian download ước lượng cho một file
Set-Cookie: String Thiết lập cookie được truyền thông qua String
Các biến môi trường của CGITất cả chương trình CGI có quyền truy cập tới các biến môi trường sau. Các biến này đóng một vai trò quan trọng trong khi viết bất cứ chương trình CGI nào.
Tên biếnCONTENT_TYPE
Kiểu dữ liệu của nội dung. Được sử dụng khi Client đang gửi nội dung đính kèm tới Server. Ví dụ: file upload CONTENT_LENGTH
Độ dài của thông tin truy vấn. Chỉ có sẵn cho các yêu cầu POST HTTP_COOKIE
Trả về các Cookie đã thiết lập trong dạng là cặp key/value HTTP_USER_AGENT
Trường User-Agent chứa thông tin về user agent tạo yêu cầu. Đây là tên của trình duyệt web HTTP_USER_AGENT
Trường User-Agent chứa thông tin về user agent tạo yêu cầu. Đây là tên của trình duyệt web PATH_INFO

Path cho CGI script

import os

print "Content-type: text/html\r\n\r\n";
print "Environment<\br>";
for param in os.environ.keys():
  print "%20s: %s<\br>" % (param, os.environ[param])

QUERY_STRING

Thông tin mã hóa URL được gửi với phương thức GET

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

REMOTE_ADDR

Địa chỉ IP của host từ xa mà tạo yêu cầu. Biến này hữu ích cho log và xác nhận

REMOTE_HOST

Tên đầy đủ của host tạo yêu cầu. Nếu thông tin này không có sẵn, thì REMOTE_ADDR có thể được sử dụng để lấy địa chỉ IP

REQUEST_METHOD

/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.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.

First Name:
Last Name:

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.

First Name:
Last Name:

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

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

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
0

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

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
1

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


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

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
2

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

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
3

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.multipart/form-data.

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
4

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

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
5

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. 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. 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. 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. 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. Cookie được thiết lập và thu nhận trong dạng các cặp key-value.

Để 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 "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
6

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.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 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:

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
7

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

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Lap trinh CGI trong Python'
print ''
print ''
print '

Day la chuong trinh CGI dau tien trong Python

' print '' print ''
8