2010年10月19日 星期二

用 Python 寫 CGI

參考資料:



之前用 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 可能是使用執行者的環境變數,跟你自己執行時不一樣。



  • 如果 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 一下。


以上算是一個很簡單的筆記吧


沒有留言:

張貼留言