一、CGI介紹
CGI(Common Gateway Interface)是一種通用的網關協議,它定義了WEB服務器如何向WEB應用程序轉送用戶請求數據,以及如何把應用程序的執行結果返回給WEB服務器。
在WEB服務器接受用戶的請求後,如果這個請求是針對CGI程序的,那麼它會把數據傳送給指定的CGI程序,CGI程序處理完成後返回結果給WEB服務器,WEB服務器再將結果返回給用戶。CGI程序可以是任何可執行文件,其輸出的結果必須符合HTTP Response所規定的格式,常見的語言有Perl、Python等。
Python通過cgi、wsgiref和mod_python三種方式支持CGI編程,其中cgi和mod_python在Python 3.8版本之後已經不再支持,本文將重點介紹wsgiref庫的使用方法。
二、wsgiref庫簡介
wsgiref是Python自帶的WSGI參考實現庫,它提供了一個簡單的WSGI(Web Server Gateway Interface)服務器和中間件框架。WSGI是Python Web應用程序和Web服務器之間的標準接口,它規定了Web服務器與Python應用程序之間的通信協議,定義了應用程序和服務器之間的信息傳遞方式。
wsgiref庫提供的核心組件是wsgiref.simple_server和wsgiref.handlers模塊,分別用於啟動WSGI服務器和處理WSGI應用程序的請求。在Python 3.8版本之後,wsgiref成為Python標準庫的一部分,使用更加方便。
三、實現動態網站交互功能
1. 在HTML中使用CGI
我們可以使用HTML中的form表單將用戶的輸入數據打包成HTTP請求發送給CGI程序,CGI程序處理後將結果返回給瀏覽器,瀏覽器再將結果顯示在頁面上。下面是一個簡單的例子:
<html> <body> <form action="demo.cgi" method="get"> First name: <input type="text" name="fname"><br> Last name: <input type="text" name="lname"><br> <input type="submit" value="Submit"> </form> </body> </html>
我們可以通過GET或POST等HTTP請求方法將表單數據發送給CGI程序。在上面的例子中,我們使用了GET方法提交數據,將表單數據發送給了demo.cgi程序。
我們可以使用Python編寫CGI程序來處理這些請求,並生成HTTP Response返回給瀏覽器。下面是一個簡單的demo.cgi程序:
#!/usr/bin/python3 import cgi, cgitb print("Content-type:text/html\r\n\r\n") print("<html>") print("<head>") print("<title>CGI Test</title>") print("</head>") print("<body>") form = cgi.FieldStorage() if "fname" in form and "lname" in form: print("<h2>Hello %s %s</h2>" % (form["fname"].value, form["lname"].value)) else: print("<h2>Hello World</h2>") print("</body>") print("</html>")
在demo.cgi程序中,我們使用了cgi模塊和cgitb模塊來處理HTTP請求。首先,我們設置Content-type為text/html,表明返回的是HTML頁面,然後獲取表單數據,如果表單中有fname和lname參數,則將其作為字符串格式化到HTML頁面中,否則返回Hello World字符串。
2. 使用wsgiref模塊啟動WSGI服務器
wsgiref提供了一個簡單的WSGI服務器,我們可以使用它來啟動CGI程序並處理HTTP請求。下面是一個簡單的例子:
#!/usr/bin/python3 from wsgiref.simple_server import make_server import cgi, cgitb def application(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) output = "<html><head><title>CGI Test</title></head><body>" form = cgi.FieldStorage(fp=environ['wsgi.input'],environ=environ) if 'fname' in form and 'lname' in form: output += "<h2>Hello %s %s</h2>" % (form['fname'].value, form['lname'].value) else: output += "<h2>Hello World</h2>" output += "</body></html>" return [bytes(output,'utf-8')] httpd = make_server('', 8000, application) httpd.serve_forever()
在上面的例子中,我們編寫了一個名為application的WSGI應用程序函數,它接受兩個參數:environ和start_response。environ是一個包含了HTTP請求信息的字典對象,start_response是一個可以設置HTTP頭信息的函數。
我們定義了一個output字符串來存儲生成的HTML頁面,獲取表單數據並生成HTML頁面,最後通過return語句返回HTTP Response。
我們使用make_server函數創建了一個簡單的WSGI服務器對象,將IP地址設置為空字符串,端口號設置為8000,並指定應用程序為上面定義的application函數。最後調用serve_forever方法啟動服務器,等待HTTP請求。
四、結論
CGI是一種通用的網關協議,定義了WEB服務器如何向WEB應用程序轉送用戶請求數據,以及如何把應用程序的執行結果返回給WEB服務器。Python通過cgi、wsgiref和mod_python三種方式支持CGI編程,其中wsgiref是Python自帶的WSGI參考實現庫。我們可以通過wsgiref來啟動一個簡單的WSGI服務器,處理HTTP請求。在HTML頁面中,我們可以使用form表單將用戶的輸入數據打包成HTTP請求發送給CGI程序,CGI程序處理請求後將結果返回給瀏覽器,瀏覽器再將結果顯示在頁面上。
原創文章,作者:BEZWT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331391.html