python 编写 cgi 脚本
cgi.py
使用python編寫cgi程序時,需要使用該模塊;它還提供了一些調試腳本,以及處理文件上傳請求的工具。
1 介紹
cgi腳本由http server(Apache httpd,nginx)調用,通常處理一些用戶提交的信息。
CGI腳本的輸出應該包括兩部分,這兩部分由空行分開。
第一部分說明返回內容的形式:
print "Content-Type: text/html" # HTML is following print # blank line, end of headers第二部分是返回的內容,一般為html;
print "<TITLE>CGI script output</TITLE>" print "<H1>This is my first CGI script</H1>" print "Hello, world!"2 使用
2.1
模塊引用
import cgi import cgitb cgitb.enable()cgitb 會開啟異常處理機制,可以在瀏覽器中看到錯誤的詳細信息。如果不想在頁面顯示,也可以通過以下形式將其保存在指定文件中:
import cgitb cgitb.enable(display=0, logdir="/path/to/logdir")在開發cgi腳本時特別有用。可以在腳本測試完成后,再刪除cgitb配置行。
2.2 表單數據
處理表單數據時,最好使用 FieldStorage 類。
form = cgi.FieldStorage() if "name" not in form or "addr" not in form:print "<H1>Error</H1>"print "Please fill in the name and addr fields."return print "<p>name:", form["name"].value print "<p>addr:", form["addr"].value ...further form processing here...值為空的表單字段會被過濾掉,因此使用時需要判斷是否存某字段,也可以使用FieldStorage(keep_blank_values=true)來保留這些空值的字段。
當提交的表單中,一個字段name對應多個value時, getvalue()將返回一個list。如果使用 form.getlist(),那么將始終返回一個list。
value = form.getlist("username") usernames = ",".join(value)表單:
<input type="checkbox" name="item" value="1" /> <input type="checkbox" name="item" value="2" />cgi腳本可以這樣寫:
item = form.getvalue("item") if isinstance(item, list):# The user is requesting more than one item. else:# The user is requesting only one item.如果以簡單的形式處理:
user = form.getvalue("user").upper()這種情況下,請求數據的格式一定不能出錯,如果有的client在url的query字符串中也添加了一個 item=foo。那么cgi腳本就崩潰了,因為getvalue會返回一個列表。
這種通過判斷的形式寫的cgi腳本,邏輯判斷太多,可讀性不好。一個更方便的方法是使用 getfirst() 和 getlist()。
FieldStorage.getfirst(name [, defalut])
該方法只返回第一個值,當然第一值是否與期望值是否匹配,因瀏覽器而異。如果字段值為空時,也可以給定一個默認值。
FieldStorage.getlist(name)
該方法始終返回一個list,當值為空時,則返回空list。
import cgi form = cgi.FieldStorage() user = form.getfirst("user", "").upper() # This way it's safe. for item in form.getlist("item"):do_something(item)這樣的代碼會顯得更加優雅緊湊。
2.3 上傳文件處理
如果字段為上傳的文件名,那么通過value或者getvalue()訪問該時將會以字符串的形式讀取內存中的文件。一般情況下,應該先做判斷,然后再讀取。
fileitem = form["userfile"] if fileitem.file:# It's an uploaded file; count lineslinecount = 0while 1:line = fileitem.file.readline()if not line: breaklinecount = linecount + 1通過Post提交的表單,同時又存在 query 字符串的形式,那么將同時包含 FieldStorage 和 MiniFieldStorage。
3 函數
cgi.parse() cgi.parse_header() cgi.test() cgi.print_environ() cgi.print_form() cgi.print_directory() cgi.print_environ_usage() cgi.escape()4 其他
對于任何需要cgi腳本讀、寫的文件,應該有足夠的讀(0644)寫(0666)權限,出于安全考慮,HTTP server以 ‘nobody’用戶執行腳本,沒有任何特殊權限。
當需要加載自定義的 python 模塊時,可以先在腳本中更改模塊搜索路徑。
通過以上方式可以檢測是否有語法錯誤。
總結
以上是生活随笔為你收集整理的python 编写 cgi 脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Box2D的安装小结
- 下一篇: 【Java】将输入的 24 小时制时间转