日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 编写 cgi 脚本

發(fā)布時間:2023/12/20 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 编写 cgi 脚本 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

cgi.py

使用python編寫cgi程序時,需要使用該模塊;它還提供了一些調(diào)試腳本,以及處理文件上傳請求的工具。

1 介紹

cgi腳本由http server(Apache httpd,nginx)調(diào)用,通常處理一些用戶提交的信息。

CGI腳本的輸出應(yīng)該包括兩部分,這兩部分由空行分開。

第一部分說明返回內(nèi)容的形式:

print "Content-Type: text/html" # HTML is following print # blank line, end of headers

第二部分是返回的內(nèi)容,一般為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 會開啟異常處理機制,可以在瀏覽器中看到錯誤的詳細(xì)信息。如果不想在頁面顯示,也可以通過以下形式將其保存在指定文件中:

import cgitb cgitb.enable(display=0, logdir="/path/to/logdir")

在開發(fā)cgi腳本時特別有用。可以在腳本測試完成后,再刪除cgitb配置行。

2.2 表單數(shù)據(jù)

處理表單數(shù)據(jù)時,最好使用 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)來保留這些空值的字段。

  • 字段值可以通過value屬性獲得;
  • 也可以通過getvalue()方法獲得,getvalue()方法運行設(shè)置defalut value。
  • 當(dāng)提交的表單中,一個字段name對應(yīng)多個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()

    這種情況下,請求數(shù)據(jù)的格式一定不能出錯,如果有的client在url的query字符串中也添加了一個 item=foo。那么cgi腳本就崩潰了,因為getvalue會返回一個列表。

    這種通過判斷的形式寫的cgi腳本,邏輯判斷太多,可讀性不好。一個更方便的方法是使用 getfirst() 和 getlist()。

    FieldStorage.getfirst(name [, defalut])

    該方法只返回第一個值,當(dāng)然第一值是否與期望值是否匹配,因瀏覽器而異。如果字段值為空時,也可以給定一個默認(rèn)值。

    FieldStorage.getlist(name)

    該方法始終返回一個list,當(dāng)值為空時,則返回空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)

    這樣的代碼會顯得更加優(yōu)雅緊湊。

    2.3 上傳文件處理

    如果字段為上傳的文件名,那么通過value或者getvalue()訪問該時將會以字符串的形式讀取內(nèi)存中的文件。一般情況下,應(yīng)該先做判斷,然后再讀取。

    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 函數(shù)

    cgi.parse() cgi.parse_header() cgi.test() cgi.print_environ() cgi.print_form() cgi.print_directory() cgi.print_environ_usage() cgi.escape()

    4 其他

  • 對于任何需要cgi腳本讀、寫的文件,應(yīng)該有足夠的讀(0644)寫(0666)權(quán)限,出于安全考慮,HTTP server以 ‘nobody’用戶執(zhí)行腳本,沒有任何特殊權(quán)限。

  • 當(dāng)需要加載自定義的 python 模塊時,可以先在腳本中更改模塊搜索路徑。

  • import sys sys.path.insert(0, "/usr/home/joe/lib/python") sys.path.insert(0, "/usr/local/lib/python")
  • 如果腳本有語法錯誤,Pyhotn解析器就不會去執(zhí)行,HTTP Server將會發(fā)送未知錯誤到client。
  • #> python cgi-script.py

    通過以上方式可以檢測是否有語法錯誤。

    總結(jié)

    以上是生活随笔為你收集整理的python 编写 cgi 脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。