一、CGI基礎
CGI是「公共網關介面」(Common Gateway Interface)的縮寫,它是一個標準,定義了Web伺服器與腳本解釋器之間的介面。通過CGI,Web伺服器可以調用外部腳本解釋器,將用戶的請求傳遞給腳本,腳本計算出結果後,把結果返回給Web伺服器,由Web伺服器將結果發回給用戶。
CGI腳本必須可執行,通常是編寫一段程序,比如Python,Perl,C語言等程序。Web伺服器會調用這個程序,將HTTP請求傳遞給它。該程序相當於一個網頁與後端數據交互的介面。
下面是一個最簡單的Python CGI程序實現,該程序會返回一個HTML頁面:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- print("Content-type:text/html\r\n\r\n") print("") print("") print("Hello World from CGI ") print("") print("") print("Hello World! This is my first CGI program
") print("") print("")
在上面的程序中,第一行聲明了程序使用python3作為解釋器,第二行聲明了編碼為UTF-8。接下來就是一些HTML的標籤。
二、CGI腳本實現表單提交
表單(form)是HTML的一個重要元素,它可以和CGI進行交互。下面是一個簡單的表單,其中包含一個文本框和一個提交按鈕:
上面的表單指定了action為”/cgi-bin/form.py”,method為post,這意味著它會向CGI腳本發送一個POST請求。表單中的文本框的值會被命名為name,它將作為POST請求的參數發送到後端腳本中。
下面是一個Python CGI腳本,它能夠讀取表單參數,並返回一個包含參數內容的HTML頁面:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- import cgi form = cgi.FieldStorage() name = form.getvalue('name') print("Content-type:text/html\r\n\r\n") print('') print('') print('Hello World from CGI ') print('') print('') print('Hello %s! This is my first CGI program
' % (name if name else 'World')) print('') print('')
在上面的代碼中,我們從CGI的FieldStorage中讀取了表單參數的值,並使用字元串格式化函數構造了一個包含參數內容的HTML頁面。
三、CGI腳本實現文件上傳
通過CGI,我們可以上傳文件到後端的伺服器。HTML提供了一個input元素,它的類型(type)為file,當用戶點擊該元素時,系統會跳出一個文件選擇對話框,用戶可以選擇需要上傳的文件。
上面的代碼指定了form的method為POST,並且enctype為multipart/form-data,這樣做可以支持文件上傳。用戶上傳的文件會在後端腳本的FieldStorage對象中以文件的形式存儲。
接下來是一個Python CGI腳本,它能夠讀取用戶上傳的文件,並將文件內容返回到HTML頁面中:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- import cgi form = cgi.FieldStorage() file_item = form['file'] if file_item.filename: with open('/tmp/uploaded_file', 'wb') as fout: fout.write(file_item.file.read()) print("Content-type:text/html\r\n\r\n") print('') print('') print('File uploaded ') print('') print('') print('File uploaded successfully!
') if file_item.filename: print('Filename: %s
' % file_item.filename) print('Contents:
') print('') with open('/tmp/uploaded_file', 'rb') as fin: content = fin.read().decode('utf-8') print(html.escape(content)) print('')
else:
print('No file uploaded
')
print('')
print('')上面的代碼中,我們獲取了表單中的file元素,並打開一個本地文件,將上傳的文件內容寫入該文件。接著,我們使用字元串格式化函數構造了一個包含文件名和文件內容的HTML頁面。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291583.html