Python 3 - Lập trình CGI

Giao diện cổng chung, hoặc CGI, là một tập hợp các tiêu chuẩn xác định cách thông tin được trao đổi giữa máy chủ web và tập lệnh tùy chỉnh. Các thông số kỹ thuật CGI hiện được duy trì bởi NCSA.

CGI là gì?

  • Giao diện cổng thông thường, hoặc CGI, là một tiêu chuẩn cho các chương trình cổng bên ngoài để giao tiếp với máy chủ thông tin như máy chủ HTTP.

  • Phiên bản hiện tại là CGI / 1.1 và CGI / 1.2 đang được hoàn thiện.

Duyệt web

Để hiểu khái niệm về CGI, chúng ta hãy xem điều gì sẽ xảy ra khi chúng ta nhấp vào một siêu liên kết để duyệt qua một trang web hoặc URL cụ thể.

  • Trình duyệt của bạn liên hệ với máy chủ web HTTP và yêu cầu URL, tức là tên tệp.

  • Máy chủ Web phân tích cú pháp URL và tìm kiếm tên tệp. Nếu nó tìm thấy tệp đó thì hãy gửi nó trở lại trình duyệt, nếu không sẽ gửi thông báo lỗi cho biết rằng bạn đã yêu cầu một tệp sai.

  • Trình duyệt web nhận phản hồi từ máy chủ web và hiển thị tệp đã nhận hoặc thông báo lỗi.

Tuy nhiên, có thể thiết lập máy chủ HTTP để bất cứ khi nào tệp trong một thư mục nhất định được yêu cầu, tệp đó sẽ không được gửi lại; thay vào đó, nó được thực thi như một chương trình và bất cứ thứ gì mà chương trình đó xuất ra đều được gửi lại để trình duyệt của bạn hiển thị. Chức năng này được gọi là Giao diện cổng chung hoặc CGI và các chương trình được gọi là tập lệnh CGI. Các chương trình CGI này có thể là Python Script, PERL Script, Shell Script, chương trình C hoặc C ++, v.v.

Sơ đồ kiến ​​trúc CGI

Hỗ trợ và cấu hình máy chủ web

Trước khi bạn tiến hành Lập trình CGI, hãy đảm bảo rằng Máy chủ Web của bạn hỗ trợ CGI và nó được cấu hình để xử lý các Chương trình CGI. Tất cả các Chương trình CGI sẽ được thực thi bởi máy chủ HTTP được lưu giữ trong một thư mục được cấu hình trước. Thư mục này được gọi là Thư mục CGI và theo quy ước, nó được đặt tên là / var / www / cgi-bin. Theo quy ước, các tệp CGI có phần mở rộng là.cgi, nhưng bạn có thể giữ các tệp của mình bằng tiện ích mở rộng python .py cũng.

Theo mặc định, máy chủ Linux được định cấu hình để chỉ chạy các tập lệnh trong thư mục cgi-bin trong / var / www. Nếu bạn muốn chỉ định bất kỳ thư mục nào khác để chạy các tập lệnh CGI của mình, hãy nhận xét các dòng sau trong tệp 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>

Ở đây, chúng tôi giả định rằng bạn đã thiết lập và chạy thành công Máy chủ Web và bạn có thể chạy bất kỳ chương trình CGI nào khác như Perl hoặc Shell, v.v.

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

Đây là một liên kết đơn giản, được liên kết với tập lệnh CGI có tên hello.py . Tệp này được lưu trong thư mục / var / www / cgi-bin và có nội dung sau. Trước khi chạy chương trình CGI, hãy đảm bảo rằng bạn đã thay đổi chế độ tệp bằng cách sử dụngchmod 755 hello.py Lệnh UNIX để thực thi tệp.

#!/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- Dòng đầu tiên trong tập lệnh phải là đường dẫn đến tệp thực thi Python. Trong Linux, nó phải là #! / Usr / bin / python3

Nhập URL sau vào trình duyệt của bạn

http://localhost:8080/cgi-bin/hello.py

Hello Word! This is my first CGI program

Tập lệnh hello.py này là một tập lệnh Python đơn giản, viết đầu ra của nó trên tệp STDOUT, tức là màn hình. Có một tính năng quan trọng và bổ sung có sẵn đó là dòng đầu tiên được inContent-type:text/html\r\n\r\n. Dòng này được gửi trở lại trình duyệt và nó chỉ định loại nội dung sẽ được hiển thị trên màn hình trình duyệt.

Đến đây chắc hẳn bạn đã hiểu khái niệm cơ bản về CGI và bạn có thể viết nhiều chương trình CGI phức tạp bằng Python. Tập lệnh này có thể tương tác với bất kỳ hệ thống bên ngoài nào khác cũng để trao đổi thông tin như RDBMS.

Tiêu đề HTTP

Dòng Content-type:text/html\r\n\r\nlà một phần của tiêu đề HTTP được gửi đến trình duyệt để hiểu nội dung. Tất cả tiêu đề HTTP sẽ ở dạng sau:

HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n

Có một số tiêu đề HTTP quan trọng khác mà bạn sẽ sử dụng thường xuyên trong Lập trình CGI của mình.

Sr.No. Tiêu đề & Mô tả
1

Content-type:

Một chuỗi MIME xác định định dạng của tệp được trả về. Ví dụ là Content-type: text / html

2

Expires: Date

Ngày thông tin trở nên không hợp lệ. Nó được trình duyệt sử dụng để quyết định khi nào một trang cần được làm mới. Chuỗi ngày hợp lệ có định dạng 01/01/1998 12:00:00 GMT.

3

Location: URL

URL được trả về thay vì 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 đến bất kỳ tệp nào.

4

Last-modified: Date

Ngày sửa đổi cuối cùng của tài nguyên.

5

Content-length: N

Độ dài, tính bằng byte, của dữ liệu được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian tải xuống ước tính cho một tệp.

6

Set-Cookie: String

Đặt cookie được chuyển qua chuỗi

Biến môi trường CGI

Tất cả các chương trình CGI đều có quyền truy cập vào 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 kỳ chương trình CGI nào.

Sr.No. Tên và mô tả biến
1

CONTENT_TYPE

Kiểu dữ liệu của nội dung. Được sử dụng khi máy khách đang gửi nội dung đính kèm đến máy chủ. Ví dụ: tải lên tệp.

2

CONTENT_LENGTH

Độ dài của thông tin truy vấn. Nó chỉ có sẵn cho các yêu cầu ĐĂNG.

3

HTTP_COOKIE

Trả về các cookie đã đặt ở dạng cặp khóa & giá trị.

4

HTTP_USER_AGENT

Trường tiêu đề yêu cầu Tác nhân người dùng chứa thông tin về tác nhân người dùng bắt nguồn yêu cầu. Nó là tên của trình duyệt web.

5

PATH_INFO

Đường dẫn cho tập lệnh CGI.

6

QUERY_STRING

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

7

REMOTE_ADDR

Địa chỉ IP của máy chủ từ xa thực hiện yêu cầu. Đây là cách ghi nhật ký hữu ích hoặc để xác thực.

số 8

REMOTE_HOST

Tên đầy đủ đủ điều kiện của máy chủ thực hiện 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ỉ IR.

9

REQUEST_METHOD

Phương pháp được sử dụng để thực hiện yêu cầu. Các phương pháp phổ biến nhất là GET và POST.

10

SCRIPT_FILENAME

Đường dẫn đầy đủ đến tập lệnh CGI.

11

SCRIPT_NAME

Tên của tập lệnh CGI.

12

SERVER_NAME

Tên máy chủ hoặc Địa chỉ IP của máy chủ

13

SERVER_SOFTWARE

Tên và phiên bản của phần mềm mà máy chủ đang chạy.

Đây là chương trình CGI nhỏ để liệt kê tất cả các biến CGI. Nhấp vào liên kết này để xem kết quả Nhận môi trường

#!/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]))

Phương thức GET và POST

Chắc hẳn bạn đã gặp phải nhiều tình huống khi bạn cần chuyển một số thông tin từ trình duyệt đến máy chủ web và cuối cùng là Chương trình CGI của mình. Thông thường nhất, trình duyệt sử dụng hai phương pháp truyền thông tin này đến máy chủ web. Các phương thức này là GET Method và POST Method.

Truyền thông tin bằng phương pháp GET

Phương thức GET gửi thông tin người dùng đã mã hóa được thêm vào yêu cầu trang. Trang và thông tin được mã hóa được phân tách bằng dấu? nhân vậ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 để chuyển thông tin từ trình duyệt đến máy chủ web và nó tạo ra một chuỗi dài xuất hiện trong hộp Location: của trình duyệt của bạn.

  • Không bao giờ sử dụng phương thức GET nếu bạn có mật khẩu hoặc thông tin nhạy cảm khác để chuyển đến máy chủ.

  • Phương thức GET có giới hạn về kích thước: chỉ có thể gửi 1024 ký tự trong một chuỗi yêu cầu.

  • Phương thức GET gửi thông tin bằng tiêu đề QUERY_STRING và sẽ có thể truy cập được trong Chương trình CGI của bạn thông qua biến môi trường QUERY_STRING.

Bạn có thể chuyển thông tin bằng cách chỉ cần nối các cặp khóa và giá trị cùng với bất kỳ URL nào hoặc bạn có thể sử dụng thẻ HTML <FORM> để chuyển thông tin bằng phương thức GET.

Ví dụ về URL đơn giản: Phương thức lấy

Đây là một URL đơn giản, chuyển hai giá trị đến chương trình hello_get.py bằng phương thức GET.

/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI

Dưới là hello_get.pyscript để xử lý đầu vào do trình duyệt web cung cấp. Chúng tôi sẽ sử dụngcgi mô-đun, giúp dễ dàng truy cập thông tin đã chuyển -

#!/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>")

Điều này sẽ tạo ra kết quả sau:

Hello ZARA ALI

MẪU đơn giản Ví dụ: Phương pháp GET

Ví dụ này chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng tôi sử dụng cùng một tập lệnh CGI hello_get.py để xử lý đầu vào này.

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

Đây là kết quả thực tế của biểu mẫu trên, bạn nhập Họ và Tên rồi nhấn nút gửi để xem kết quả.

Truyền thông tin bằng phương pháp POST

Một phương pháp truyền thông tin đến chương trình CGI thường đáng tin cậy hơn là phương pháp POST. Điều này đóng gói thông tin theo cách giống hệt như các phương thức GET, nhưng thay vì gửi nó dưới dạng một chuỗi văn bản sau dấu? trong URL nó sẽ gửi nó dưới dạng một tin nhắn riêng biệt. Thông báo này đi vào tập lệnh CGI ở dạng đầu vào chuẩn.

Dưới đây là cùng một script hello_get.py xử lý GET cũng như phương thức 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>"

Chúng ta hãy lấy lại ví dụ tương tự như trên, chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng tôi sử dụng cùng một tập lệnh CGI hello_get.py để xử lý đầu vào này.

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

Đây là kết quả thực tế của biểu mẫu trên. Bạn điền Họ và Tên rồi bấm nút gửi để xem kết quả.

Chuyển dữ liệu hộp kiểm sang chương trình CGI

Hộp kiểm được sử dụng khi bắt buộc phải chọn nhiều tùy chọn.

Đây là mã HTML mẫu cho biểu mẫu có hai hộp kiểm -

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

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh checkbox.cgi để xử lý đầu vào do trình duyệt web cung cấp cho nút hộp kiểm.

#!/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>"

Chuyển dữ liệu nút radio sang chương trình CGI

Các nút Radio được sử dụng khi chỉ cần chọn một tùy chọn.

Đây là mã HTML mẫu cho biểu mẫu có hai nút radio -

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

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh radiobutton.py để xử lý đầu vào do trình duyệt web cung cấp cho nút radio -

#!/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>"

Chuyển dữ liệu vùng văn bản sang chương trình CGI

Phần tử TEXTAREA được sử dụng khi văn bản nhiều dòng phải được chuyển đến Chương trình CGI.

Đây là mã HTML mẫu cho biểu mẫu có hộp 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>

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh textarea.cgi để xử lý đầu vào do trình duyệt web cung cấp -

#!/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>"

Chuyển dữ liệu hộp thả xuống cho chương trình CGI

Hộp thả xuống được sử dụng khi chúng ta có nhiều tùy chọn nhưng chỉ một hoặc hai tùy chọn được chọn.

Đây là mã HTML mẫu cho biểu mẫu có một hộp thả xuống -

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

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh dropdown.py để xử lý đầu vào do trình duyệt web cung cấp.

#!/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>"

Sử dụng Cookie trong CGI

Giao thức HTTP là một giao thức không trạng thái. Đối với một trang web thương mại, bắt buộc phải duy trì thông tin phiên giữa các trang khác nhau. Ví dụ: một đăng ký người dùng kết thúc sau khi hoàn thành nhiều trang. Làm thế nào để duy trì thông tin phiên của người dùng trên tất cả các trang web?

Trong nhiều tình huống, sử dụng cookie là phương pháp hiệu quả nhất để ghi nhớ và theo dõi các sở thích, mua hàng, hoa hồng và các thông tin khác cần thiết để có trải nghiệm khách truy cập hoặc thống kê trang web tốt hơn.

Làm thế nào nó hoạt động?

Máy chủ của bạn gửi một số dữ liệu đến trình duyệt của khách truy cập dưới dạng cookie. Trình duyệt có thể chấp nhận cookie. Nếu có, nó sẽ được lưu trữ dưới dạng bản ghi văn bản thuần túy trên ổ cứng của khách truy cập. Bây giờ, khi khách truy cập đến một trang khác trên trang web của bạn, cookie sẽ có sẵn để truy xuất. Sau khi được truy xuất, máy chủ của bạn biết / ghi nhớ những gì đã được lưu trữ.

Cookie là một bản ghi dữ liệu văn bản thuần túy gồm 5 trường có độ dài thay đổi -

  • Expires- Ngày cookie sẽ hết hạn. Nếu ô này trống, 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 trang web của bạn.

  • Path- Đường dẫn đến thư mục hoặc trang web đặt cookie. Điều này có thể để trống nếu bạn muốn lấy cookie từ bất kỳ thư mục hoặc trang nào.

  • Secure- Nếu trường này chứa từ "an toàn", thì cookie chỉ có thể được truy xuất bằng máy chủ bảo mật. Nếu trường này trống, không có hạn chế như vậy tồn tại.

  • Name = Value - Cookie được thiết lập và truy xuất dưới dạng các cặp khóa và giá trị.

Thiết lập Cookie

Rất dễ dàng để gửi cookie đến trình duyệt. Các cookie này được gửi cùng với HTTP Header trước khi đến trường Content-type. Giả sử bạn muốn đặt UserID và Mật khẩu làm cookie. Việc đặt cookie được thực hiện như sau:

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

Từ ví dụ này, bạn chắc hẳn đã hiểu cách đặt cookie. Chúng tôi sử dụngSet-Cookie Tiêu đề HTTP để đặt cookie.

Bạn có thể tùy chọn đặt các thuộc tính cookie như Expires, Domain và Path. Đáng chú ý là cookie được đặt trước khi gửi dòng ma thuật"Content-type:text/html\r\n\r\n.

Truy xuất Cookie

Rất dễ dàng để truy xuất tất cả các cookie đã đặt. Cookie được lưu trữ trong biến môi trường CGI HTTP_COOKIE và chúng sẽ có dạng sau:

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

Đây là một ví dụ về cách truy xuất cookie.

#!/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

Điều này tạo ra kết quả sau cho các cookie được đặt bởi tập lệnh trên:

User ID = XYZ
Password = XYZ123

Ví dụ về Tải lên Tệp

Để tải tệp lên, biểu mẫu HTML phải có thuộc tính enctype được đặt thành multipart/form-data. Thẻ đầu vào với loại tệp sẽ tạo nút "Duyệt qua".

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

Kết quả của mã này là dạng sau:

Ví dụ trên đã bị vô hiệu hóa có chủ ý để lưu những người tải lên tệp trên máy chủ của chúng tôi, nhưng bạn có thể thử mã trên với máy chủ của mình.

Đây là kịch bản save_file.py để xử lý tải lên tệp -

#!/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,)

Nếu bạn chạy tập lệnh trên trên Unix / Linux, thì bạn cần chú ý thay thế dấu tách tệp như sau, nếu không trên máy windows của bạn ở trên câu lệnh open () sẽ hoạt động tốt.

fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

Làm thế nào để Tăng Hộp thoại "Tải xuống Tệp"?

Đôi khi, bạn muốn cung cấp tùy chọn nơi người dùng có thể nhấp vào liên kết và nó sẽ bật lên hộp thoại "Tải xuống tệp" cho người dùng thay vì hiển thị nội dung thực tế. Điều này rất dễ dàng và có thể đạt được thông qua tiêu đề HTTP. Tiêu đề HTTP này khác với tiêu đề được đề cập trong phần trước.

Ví dụ, nếu bạn muốn FileName tệp có thể tải xuống từ một liên kết nhất định, sau đó cú pháp của nó như sau:

#!/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()

Hy vọng bạn thích hướng dẫn này. Nếu có, vui lòng gửi cho tôi phản hồi của bạn tại: Liên hệ với chúng tôi