Python3伺服器提供cgi的功能

Python31可以藉由下方指令,把當前的目錄做為網頁伺服器的根目錄,運行網頁服務:

1
python3 -m http.server  8000 #開啟網路服務於 Port 8000

但是上述指令不包括支援CGI的功能,如果需要CGI的功能,必需使用:

1
python3 -m http.server --cgi 8000

不過,CGI的檔案不是任何地方都可以放置,基本上Python3的模組,預設需放在當前目錄下的cgi-binhtbin這兩個目錄中2, 才會被視為CGI,否則,會當作檔案直接下載,或者,以文字的方式直接顯示檔案裡的程式內容3

檔案目錄的結構示意圖:

Your browser does not support SVG

另外,CGI裡,輸出的前兩行文字必需含有如下內容:

1
print "Content-Type: text/plain \n\n";  #以Perl為例

或者:

1
print "Content-Type: text/html \n\n";

也就是說,輸出的內容必需有Content-Type: text/html外加一個空行4。 不然,瀏覽器只會獲得一個空白的內容。

然後,必需把檔案改為可執行檔。

這邊就以一個php檔案作為CGI內容的例子為結尾:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env php
<?php
echo "Content-Type: text/html\n\n";

echo "<html>";

echo "<head>";
echo "<title>CGI TEST</title>";
echo "</head>";

echo "<body>";
echo "<h1>CGI TEST</h1>";
echo "<p>這是一個CGI的網頁測試。火腿。荷包蛋。蕃茄醬。</p>";
echo "</body>";

echo "</html>";
?>


  1. 本來練習網頁一直都是用python當作簡易伺服器,但是直到需要使用php,才發現python不會自動去運行php的內容,雖然這個問題只要改用php自身的簡易伺服器就可以解決了:php -S 127.0.0.1:8000 -t.。但是,總會不服氣,為何php可以,python沒道理不行。

  2. python3的http.server模組預設http.server.CGIHTTPRequestHandler.cgi_directories=[‘/cgi-bin’, ‘/htbin’],如果想要改動放cgi程式的資料夾,就得重新設定這個屬性,比如說改成CGI這個目錄:http.server.CGIHTTPRequestHandler.cgi_directories=[‘/CGI’]

  3. .pl.py結尾的副檔名 會顯示內容;.php則會直接下載檔案。

  4. 當初看python3的範例上寫print(“Content-Type: text/html\n”)就自作聰明的以為python3預設是會在字串結束的地方加上換行符號,應該不用再多餘的添加\n,結果沒想到是還多需要一個空白行,而卡在這邊很久。