參考資料:
- cgi — Common Gateway Interface support
- Penzilla.net's Python Tutorial - CGI Scripting Basics
- Embedding Python In Apache2 With mod_python (Debian Etch)
- Appending to Your Python Path
之前用 Python 寫了一隻 tool,然後希望透過 web 來傳參數使用,於是就想透過 Python 實做 CGI 好了!在此不聊 Web Server 的設定,假設只需在 ~/public_html/cgi-bin 或 ~/public_html/cgi-bin 還是 ~/public_html/ 內擺放此 cgi 就行了!
注意事項:
- 該檔案要給予執行權限,如 chmod 755
- 從 CGI 呼叫 tools 做完在透過 stdout 接收,很可能會碰到編碼問題
- f = popen( 'tools arg' , 'rb' )
d = f.read()
f.close()
print d - 解法就是,改用 import 的方式,使用其 function 回傳的。我猜可能是因為 popen 可能是使用執行者的環境變數,跟你自己執行時不一樣。
- f = popen( 'tools arg' , 'rb' )
- 如果 Python 版本不符合需求,那就自己編吧!
範例(my.cgi):
#!/home/user/tarball/bin/python
# -*- coding: utf-8 -*-
import cgitb
cgitb.enable()
import cgi
print "Content-Type: text/html" # HTML is following
print # blank line, end of headers
form = cgi.FieldStorage()
if 'pattern' in form:
pattern = form['pattern'].value
page = form['page'].value if 'page' in form and int( form['page'].value ) > 0 else 1
import sys
sys.path.append( "/home/user/mypylib" )
from mylibs import *
x = online_query( query=pattern , page=int(page) )
print x.encode( 'utf-8' )
首先一開始是使用 /home/user/tarball/bin/python 自己編的 Python,理由純粹只是要用 PycURL 而已,可以參考 安裝 cURL、Python 和 PycURL @ Ubuntu Server。
接著則是 CGI 的標準用法,開頭要印出 "Content-Type: text/html\n\n" 的訊息,以 C 語言就是:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf( "Content-Type: text/html\n\n" );
return 0;
}
然後,則是使用 cgi.FieldStorage() ,就能得知 POST/GET 的資訊,此例是 pattern 跟 page 這兩個參數。
最後,則是使用自己的寫的 python code,全寫在 /home/user/mypylib/mylibs.py 裡,需要透過 sys.path.append 增加搜尋的路徑,而 online_query 回傳的是 UTF-8 的資料,因此輸出時,需要在 encode 一下。
以上算是一個很簡單的筆記吧
沒有留言:
張貼留言