、安裝PostgreSQL
二、安裝性能監控工具sysstat
yum -y install sysstat
三、安裝Apache
# yum -y install httpd
# rpm -qa | grep httpd
四、安裝pgcluu
pgClu是一個Perl程序,可用于對PostgreSQL群集和系統性能執行完全審計。它分為兩個部分:一個是使用psql命令行實用程序和sysstat包中的sar獲取PostgreSQL服務器上的統計信息的收集器;另一個是一個純Perl繪圖器,將生成所有HTML和圖表輸出。
1、安裝依賴包
# yum install perl-ExtUtils-MakeMaker perl-CGI -y
2、安裝pgcluu
# cd /software/
# wget -c https://github.com/darold/pgcluu/archive/refs/tags/v3.5.tar.gz -O pgcluu-v3.5.tar.gz
# mkdir -p /etc/apache2/conf-enabled/
# tar xzvf pgcluu-v3.5.tar.gz
# cd pgcluu-3.5/
# perl Makefile.PL
# make && make install
五、配置
# vi /etc/httpd/conf/httpd.conf
編輯為:
LoadModule cgid_module modules/mod_cgid.so
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Require all granted
Allow from all
</Directory>
AddHandler cgi-script .cgi
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
加入pgcluu相關配置,轉到項目根目錄
# mkdir /var/www/html/pgcluu/
# cd /software/pgcluu-3.5
# cp -rf cgi-bin/rsc/ /var/www/html/pgcluu/
# cp cgi-bin/pgcluu.cgi /var/www/cgi-bin/
//修改文件權限
# chown -R apache: /var/www/html/pgcluu/
# chown -R postgres:apache /var/lib/pgcluu/data/
# chmod -R u=rwX,g=rsX,o=/var/lib/pgcluu/data/
vi /var/www/cgi-bin/pgcluu.cgi
將此行注釋(否則會報錯cgi-error):
no warnings 'redundant';
啟動web服務
# systemctl enable httpd
# service httpd start
su - postgres
$ /usr/local/bin/pgcluu_collectd -D -i 60 --rotate-daily /var/lib/pgcluu/data
$ /usr/local/bin/pgcluu --cache /var/lib/pgcluu/data
如果報如下錯誤:
FATAL: can't read file /var/lib/pgcluu/data/2023/12/20/end-pg_stat_user_indexes.csv: No such file or directory
不用緊張,稍等一會兒就生成這個文件了。
$ crontab -e
加入下面內容:
*/5 * * * * /usr/local/bin/pgcluu --cache /var/lib/pgcluu/data
訪問下面地址:
http://localhost/cgi-bin/pgcluu.cgi
如果發現信息不是很完整,稍等一會兒再查看就完整了。
備注:
如果pgcluu_collectd啟動失敗(/var/run/postgresql/pgcluu_collectd.pid文件不存在,ps也看不到pgcluu_collectd的進程),則可以嘗試:
# mkdir -p /var/run/postgresql/
# chown postgres:postgres /var/run/postgresql/
# su - postgres
$ /usr/local/bin/pgcluu_collectd -D -i 60 --rotate-daily /var/lib/pgcluu/data
為了在系統重啟后,pgcluu仍能收集PostgreSQL集群上的統計信息,可以把pgcluu_collectd放在自啟動服務中:
# chmod a+x /etc/rc.d/rc.local
# vi /etc/rc.d/rc.local
添加如下內容:
# start to grab statistics on the PostgreSQL cluster
/bin/mkdir -p /var/run/postgresql/
/bin/chown postgres:postgres /var/run/postgresql/
/bin/su - postgres -c '/usr/local/bin/pgcluu_collectd -D -i 60 --rotate-daily /var/lib/pgcluu/data
苑?2015/05/28 16:28
這是「 NEXT Collections | Google I/O」系列的開篇。NEXT Collections 是NEXT 用戶基于產品集的干貨分享專欄。Google I/O 期間,我們邀請和聚集了 NEXT 用戶中的 Google 工程師、國內 Android 頂尖開發者,為大家分享和呈現關于 Google 的最干貨信息與觀點碰撞。
文章的作者 CJ 是 Google 八年的資深工程師,現回國創辦了在線協作文檔「一起寫」,這篇文章也是他與 geek 范的同事們在「一起寫」協作完成的。點擊 NEXT 產品集「Google 開源項目」,完整查看文中提到的技術與開源項目。
過去十幾年來, Web 開發技術從最初的純 HTML 到 CGI、PHP / JSP / ASP、Ajax、Rails、Node.js,已經發展到了一個非常成熟的階段。去年的 Google I/O,谷歌開發者中心推出了關于 Web 開發的最佳實踐手冊;而今年的 Google I/O ,「The Next Generation of Mobile Web」依然是其中的一個重要議程。
不過,前人栽樹,后人乘涼。現在大家拷貝的代碼可不是自己從土里自己長出來的,而是技術大牛一行行敲出來。即便是谷歌這樣的互聯網巨鱷,在 Web 開發上也經歷過無數的努力和踩過一個又一個的坑。今晚 Google I/O 正式開啟之前,我就給大家講講這些事兒,聊聊從 Desktop 時代到今天的 Mobile 時代,谷歌 Web 開發技術的變遷、踩過的坑。
| Gmail、Google Map : 世界瘋了兩次
大家知道,最早期的 web 開發指的就是 HTML,CSS,JavaScript,很多剛畢業的學生就會說,“切,會寫 HTML,JS, CSS 不算寫程序, 會寫 C++ 的才算”, 這可大錯特錯了。你們想想,寫一個 C++ 程序只需要會一種語言,寫個 Web 應用得學三種語言,而且這三種語言還以一些神秘的、很多時候還沒有文檔的奇怪方式聯系在了一起,再加上某些西北角的公司在里面再搗搗亂,導致 Web 應用非常的難以維護,直接的后果就是 99% 的應用都是簡單的網頁加上一點點可憐的邏輯,完全無法取代桌面上的應用。
這個時候,英雄出現了。Google 在 2004 年愚人節那天發布了一個叫做 Gmail 的東西,當時 email 的容量只有可憐的 10MB 或者 20MB,Google 突然說提供 1GB 的郵箱并且不斷增長,于是,全世界瘋了。可是在大容量的背后,大家發現原來 Gmail 不僅僅只是大,而且讓你覺得你在使用一個桌面的應用,而不是一個以前傳統的網頁的應用。所以可以說,Gmail 是 Web 開發的一個里程碑,第一個大規模部署的 Ajax 的應用程序。
緊接下來的一年,也就是 2005 年的情人節前后,Google Map 神奇般地出現了,世界再一次瘋了。所有人都覺得不可思議,原來網頁的程序可以做得那么酷炫,而 2000 年左右科技泡沫鼎盛時期的那些網站是多么的可笑。當時 Map 的組里面有 2 個人很值得一提,一個叫 Lars Rasmussen 的澳大利亞人,一個叫 Bret Taylor 的美國人,后面我們會慢慢的提到。
| 重寫 Gmail
在開發 Map 和 Gmail 的過程中,Google 的工程師逐漸意識到一個高度結構化的JavaScript 庫的重要性。因為邏輯越來越復雜,代碼量越來越多,功能也越堆越多,之前寫得那些代碼已經根本滿足不了不斷變化的需求了。于是偉大的工程師們做了一個 Googler 經常做的決定:我們重寫吧。
一個偉大的重寫 Gmail 的計劃逐漸張開了,也就是今天大家看到的 Gmail 的前身。在整個重寫的過程中,一個高度獨立、結構化的 JavaScript 的庫被抽象出,這就是可能很多前端工程師們知道的 Google Closure。用今天的話來說,Closure 不是一個簡單的 JavaScript 的庫,他是一種方法論,一種情懷,所以任何拿 jQuery 和 Closure 相對比的言論都是一種對 Closure 的侮辱。Closure告訴大家,大家應該像寫 java 一樣的去寫 javaScript,分清楚什么是一個類,什么是類的成員變量,什么是成員方法,什么繼承,什么是接口等等...所有你熟悉的面向對象的概念都可以在 Closure 里面找到。Closure 的出現極大地改變 Google 內部寫 JavaScript 的效率,導致復雜的 Ajax 的應用如雨后春筍一樣在 Google 內部迅速出現。
| 聰明人太多的產物:奇葩技術 GWT
如果讓 Google 的工程師們自己找 Google 一個不好的地方,一定有一點,那就是聰明人太多,沒法管理。就在 Gmail 如火如荼重寫的時候,另外一個團隊在悄無聲息的做著另外一個類似的努力去改變 Web 開發,那就是 2006 年發布的 GWT(Google Web Toolkit)。這是一個無比奇葩的技術,程序員寫的代碼是 java,出來的是 JavaScript,就像你吃的是草,擠出來的是奶一樣。這個技術的根本目的和 Closure 是一樣的,就是為了讓程序員用寫 java 的方式去寫 Web 應用,只是他的方式更直接,連 JavaScript 都省了。其實原理也很簡單,就是通過編譯器在編譯階段把 java 轉成了 JavaScript 代碼。可是,這個技術有一個致命的缺點:你想想,要有多麻煩才能在瀏覽器里面調試一堆由編譯器生產的JavaScript 代碼。于是無數的各種附加調試技術出現,告訴大家怎么去簡化 GWT 的調試,但是都沒有解決根本問題。GWT 的最大的好處就是如果你的網頁是由標準的控件組成的,比如輸入框、選擇框、多選等,那么 GWT 會極大的簡化你的代碼量.就是因為這個好處,GWT 一直活到了今天,因為 Google 最賺錢的廣告系統的前端是就是用 GWT 寫的。可見,計算機語言的世界也是看爹的哈哈。
2007,2008 貌似很平靜,Google 也沒發布什么驚人的、大的前端產品和框架。事實上,他們并沒閑著。Google 在那兩年期間做了幾個重要的收購,奠定了后面著名的 Google docs 的基礎。
2009 年,在 Google 內部雪藏了很久的 Closure 庫終于開源了,同時開源的還有一個對應的叫做 Closure Compiler 的東西,一般人理解 Closure Compiler 不就是另外 jQuery Minifier 嘛,其實可沒那么簡單,Closure 的 Compier 是可以真的理解你的 JavaScript 代碼的類型的。通過一個叫 JsDoc 的注釋形式的語法,你可以完全地把 JavaScript 當做是一種強類型的語言來寫,并且有一個編譯器來幫你查錯。在強大的工具面前,jQuery 被無情地碾壓。在接下來幾年,Google又陸陸續續的發布了對應的 Closure 的模板語言,和對應的 Closure Stylesheet 編譯器,于是 Web 的三件套,HTML + JS + CSS 在 Closure 的世界里都有了對應的工具,在 Google 內部,大部分的前端項目也都是基于這套工具來開發的。
與此同時,GWT 的小組也沒閑著,一方面更好的支持 Google 最賺錢的廣告系統前端;一方面默默的憋了一個超級大招 -- 大名鼎鼎的 Google Wave。對,Google Wave 是用 GWT 寫的,Wave 的 founder 就是我們前面提到的 Map 的創始人 Lars 。
| 又把最賺錢的廣告系統重寫了一遍
2011,2012 的 IO 上,關于 web 開發的主題很多都是基于 GWT 、Closure 展開的,一直風平浪靜地到了 2013 年。但與此同時,Google 內部已出現了一股暗黑勢力,悄悄地開發了一個完全顛覆式的前端框架 -- AngularJS 。它,就是以HTML 標簽起始符形狀命名的 AngularJS,簡稱 Angular。顛覆在哪呢?Google 的 web 前端開發框架基本采用著名的 MVC (Model-View-Controller) 結構,有效地分離數據模型和最后顯示的視圖,使代碼更清晰、更容易維護。早先的 MVC 大都是在服務器端實現的,包括先前提到的 GWT 神器。但是 AngularJS 不一樣,是一個完全在客戶端也就是瀏覽器里的 MVC 框架。這個框架在 HTML 中標注新的屬性,運行時用 JavaScript 動態解析和綁定數據關聯,簡化了 web 應用尤其是單頁應用 (single-page application) 的開發。不少數據雙向同步邏輯甚至不用手工編寫 JavaScript 就能實現了。更重要的是它制定了一整套前端組件的開發規范。雖然各種繁雜的條條框框讓它無論在 Google 內部還是開源社區都備受微詞,但它還是迅速獲得很多企業的青睞,近幾年來以異軍突起之勢成為眾多公司招募前端程序員的一項標準需求。于是瘋狂的程序員們又瘋了,開始把很多陳舊的系統用 Angular 重寫,包括前面提到了那個最賺錢的廣告系統前端。甚至Angular 一出來的時候就有人預測,Angular 就是早期的 HTML6 。
| 異類語言的誕生
說到這里,不能不提一個異類語言了,叫做 Dart 。這個 Dart 可是出自名門,是由 V8 的首席程序員 Lars Bak 在他工作之余發明的, 他一邊改善 V8 的性能,一邊琢磨如何能突破 JavaScript 語言本身諸如弱類型等限制,讓 web 程序執行速度更上一層樓。他最后決定,干脆擺脫 JavaScript 的束縛,重起爐灶設計一門全新的、為新時代 Web App 專門打造的語言 -- Dart。
在了解 Dart 前,簡單科普一下同父同母的兄弟 V8。 Google 的 Chrome 瀏覽器當年發布時以其遠超 Internet Explorer 和 Firefox的網頁渲染速度震撼了世界。其中一個核心優勢就在于全新的 V8 JavaScript 引擎。當競爭對手還在吭哧吭哧解釋執行 (interpret) 網頁中的腳本時,強大的 V8 引擎采用即時編譯 (JIT) 技術把 JavaScript 的運行速度提升到了一個全新的層次。在之后的幾年里,各家瀏覽器廠商紛紛效仿,推進了整個 Web 平臺的發展。目前深受追捧的 Node.js / io.js 其實也都是 V8 開源后的衍生產品,造就了一個前后端用同一種編程語言的新興開發生態。
Dart 語言借鑒了廣大程序員熟悉的 Java 語法,支持面向對象、單繼承、interface、泛型、非強制的類型標記等語言特性。Dart 的虛擬機在 V8 大牛的打造下性能當然也是超強的。Dart 程序還能被編譯成 JavaScript,運行在沒有 Dart VM 的環境中。
然而,Dart 從發布日起一直倍受爭議和質疑。它被認為是一項分裂 web 之舉,而且長期以來沒有得到任何其他瀏覽器廠商的支持。2015 年初,Google 宣布取消將 Dart VM 綁定在 Chrome 瀏覽器里的計劃。不過這并不是 Dart 的死刑判決。Google 仍然支持并使用 Dart 開發大型 web 應用,因為比起 JavaScript,Dart 更能提高開發效率和保證代碼質量。
綜上,大家可以看到,web 在開發上兩個趨勢,第一個是從腳本語言層面去改善代碼的質量,提高效率,第二是從 web 標準入手,提供更多抽象的模塊化的組件,讓編寫 web 應用更加容易。
而說到第二點,不得不提提 Google 的一個項目叫做 Polymer ,如果你們去 Polymer 的網站,你會發現 Polymer 的口號是「leverage the future of web platform now」。 的確,Polymer 是一個庫用來實現 Web component 的,而 web component 是 W3C 關于下一代 HTML 的一個標準,這可是根正苗紅的一個項目。可以說 Polymer 項目的進展某種程度上就代表了下一代 HTML 標準制定的進展。讓我們一起期待在本次 IO 上 Google 會對 Polymer 做出怎樣的更新吧。
「 NEXT Collections | Google I/O」系列將持續更新,請保持關注。你也是一枚 Googler 或 Android 開發,并且有話要說?對文章觀點有質疑?想加入 Google 工程師和 Android 開發大牛的線下討論?歡迎郵件 xinyuan@36kr.com。文章作者的新項目「一起寫」也在招聘 geek 范的同事,歡迎簡歷快遞至 CEO 直聘郵箱:c@yiqixie.com。
原創文章,作者:馨苑
作者
歡迎專心練劍的產品人和技術宅來聊:xinyuan@36kr.com :)
CGI 目前由NCSA維護,NCSA定義CGI如下:
CGI(Common Gateway Interface),通用網關接口,它是一段程序,運行在服務器上如:HTTP服務器,提供同客戶端HTML頁面的接口。
為了更好的了解CGI是如何工作的,我們可以從在網頁上點擊一個鏈接或URL的流程:
CGI程序可以是Python腳本,PERL腳本,SHELL腳本,C或者C++程序等。
在你進行CGI編程前,確保您的Web服務器支持CGI及已經配置了CGI的處理程序。
Apache 支持CGI 配置:
設置好CGI目錄:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
所有的HTTP服務器執行CGI程序都保存在一個預先配置的目錄。這個目錄被稱為CGI目錄,并按照慣例,它被命名為/var/www/cgi-bin目錄。
CGI文件的擴展名為.cgi,python也可以使用.py擴展名。
默認情況下,Linux服務器配置運行的cgi-bin目錄中為/var/www。
如果你想指定其他運行 CGI 腳本的目錄,可以修改 httpd.conf 配置文件,如下所示:
在 AddHandler 中添加 .py 后綴,這樣我們就可以訪問 .py 結尾的 python 腳本文件:
AddHandler cgi-script .cgi .pl .py
我們使用Python創建第一個CGI程序,文件名為hello.py,文件位于/var/www/cgi-bin目錄中,內容如下:
文件保存后修改 hello.py,修改文件權限為 755:
chmod 755 hello.py
以上程序在瀏覽器訪問 http://localhost/cgi-bin/hello.py 顯示結果如下:
Hello World! 我是來自菜鳥教程的第一CGI程序
這個的hello.py腳本是一個簡單的Python腳本,腳本第一行的輸出內容"Content-type:text/html"發送到瀏覽器并告知瀏覽器顯示的內容類型為"text/html"。
用 print 輸出一個空行用于告訴服務器結束頭部信息。
hello.py文件內容中的" Content-type:text/html"即為HTTP頭部的一部分,它會發送給瀏覽器告訴瀏覽器文件的內容類型。
HTTP頭部的格式如下:
HTTP 字段名: 字段內容
例如:
Content-type: text/html
以下表格介紹了CGI程序中HTTP頭部經常使用的信息:
所有的CGI程序都接收以下的環境變量,這些變量在CGI程序中發揮了重要的作用:
以下是一個簡單的CGI腳本輸出CGI的環境變量:
將以上點保存為 test.py ,并修改文件權限為 755,執行結果如下:
瀏覽器客戶端通過兩種方法向服務器傳遞信息,這兩種方法就是 GET 方法和 POST 方法。
使用GET方法傳輸數據
GET方法發送編碼后的用戶信息到服務端,數據信息包含在請求頁面的URL上,以"?"號分割, 如下所示:
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
有關 GET 請求的其他一些注釋:
簡單的url實例:GET方法
以下是一個簡單的URL,使用GET方法向hello_get.py程序發送兩個參數:
/cgi-bin/test.py?name=菜鳥教程&url=http://www.runoob.com 以下為hello_get.py文件的代碼:
文件保存后修改 hello_get.py,修改文件權限為 755:
chmod 755 hello_get.py
瀏覽器請求輸出結果:
以下是一個通過HTML的表單使用GET方法向服務器發送兩個數據,提交的服務器腳本同樣是hello_get.py文件,hello_get.html 代碼如下:
默認情況下 cgi-bin 目錄只能存放腳本文件,我們將 hello_get.html 存儲在 test 目錄下,修改文件權限為 755:
chmod 755 hello_get.html
Gif 演示如下所示:
使用POST方法向服務器傳遞數據是更安全可靠的,像一些敏感信息如用戶密碼等需要使用POST傳輸數據。
以下同樣是hello_get.py ,它也可以處理瀏覽器提交的POST表單數據:
以下為表單通過POST方法(method="post")向服務器腳本 hello_get.py 提交數據:
Gif 演示如下所示:
checkbox用于提交一個或者多個選項數據,HTML代碼如下:
以下為 checkbox.py 文件的代碼:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 處理模塊 import cgi, cgitb # 創建 FieldStorage的實例 form=cgi.FieldStorage() # 接收字段數據 if form.getvalue('google'): google_flag="是" else: google_flag="否" if form.getvalue('runoob'): runoob_flag="是" else: runoob_flag="否" print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>菜鳥教程 CGI 測試實例</title>" print "</head>" print "<body>" print "<h2> 菜鳥教程是否選擇了 : %s</h2>" % runoob_flag print "<h2> Google 是否選擇了 : %s</h2>" % google_flag print "</body>" print "</html>"
修改 checkbox.py 權限:
chmod 755 checkbox.py
瀏覽器訪問 Gif 演示圖:
通過CGI程序傳遞Radio數據
Radio 只向服務器傳遞一個數據,HTML代碼如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <form action="/cgi-bin/radiobutton.py" method="post" target="_blank"> <input type="radio" name="site" value="runoob" /> 菜鳥教程 <input type="radio" name="site" value="google" /> Google <input type="submit" value="提交" /> </form> </body> </html>
radiobutton.py 腳本代碼如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 處理模塊 import cgi, cgitb # 創建 FieldStorage的實例 form=cgi.FieldStorage() # 接收字段數據 if form.getvalue('site'): site=form.getvalue('site') else: site="提交數據為空" print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>菜鳥教程 CGI 測試實例</title>" print "</head>" print "<body>" print "<h2> 選中的網站是 %s</h2>" % site print "</body>" print "</html>"
修改 radiobutton.py 權限:
chmod 755 radiobutton.py
瀏覽器訪問 Gif 演示圖:
通過CGI程序傳遞 Textarea 數據
Textarea 向服務器傳遞多行數據,HTML代碼如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <form action="/cgi-bin/textarea.py" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在這里輸入內容... </textarea> <input type="submit" value="提交" /> </form> </body> </html>
textarea.py 腳本代碼如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 處理模塊 import cgi, cgitb # 創建 FieldStorage的實例 form=cgi.FieldStorage() # 接收字段數據 if form.getvalue('textcontent'): text_content=form.getvalue('textcontent') else: text_content="沒有內容" print "Content-type:text/html" print print "<html>" print "<head>"; print "<meta charset=\"utf-8\">" print "<title>菜鳥教程 CGI 測試實例</title>" print "</head>" print "<body>" print "<h2> 輸入的內容是:%s</h2>" % text_content print "</body>" print "</html>"
修改 textarea.py 權限:
chmod 755 textarea.py
瀏覽器訪問 Gif 演示圖:
通過CGI程序傳遞下拉數據。
HTML 下拉框代碼如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <form action="/cgi-bin/dropdown.py" method="post" target="_blank"> <select name="dropdown"> <option value="runoob" selected>菜鳥教程</option> <option value="google">Google</option> </select> <input type="submit" value="提交"/> </form> </body> </html>
dropdown.py 腳本代碼如下所示:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 處理模塊 import cgi, cgitb # 創建 FieldStorage的實例 form=cgi.FieldStorage() # 接收字段數據 if form.getvalue('dropdown'): dropdown_value=form.getvalue('dropdown') else: dropdown_value="沒有內容" print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>菜鳥教程 CGI 測試實例</title>" print "</head>" print "<body>" print "<h2> 選中的選項是:%s</h2>" % dropdown_value print "</body>" print "</html>"
修改 dropdown.py 權限:
chmod 755 dropdown.py
瀏覽器訪問 Gif 演示圖:
CGI中使用Cookie
在 http 協議一個很大的缺點就是不對用戶身份的進行判斷,這樣給編程人員帶來很大的不便, 而 cookie 功能的出現彌補了這個不足。
cookie 就是在客戶訪問腳本的同時,通過客戶的瀏覽器,在客戶硬盤上寫入紀錄數據 ,當下次客戶訪問腳本時取回數據信息,從而達到身份判別的功能,cookie 常用在身份校驗中。
http cookie的發送是通過http頭部來實現的,他早于文件的傳遞,頭部set-cookie的語法如下:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
Cookie的設置非常簡單,cookie會在http頭部單獨發送。以下實例在cookie中設置了name 和 expires:
#!/usr/bin/python # -*- coding: UTF-8 -*- # print 'Content-Type: text/html' print 'Set-Cookie: name="菜鳥教程";expires=Wed, 28 Aug 2016 18:30:00 GMT' print print """ <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <h1>Cookie set OK!</h1> </body> </html> """
將以上代碼保存到 cookie_set.py,并修改 cookie_set.py 權限:
chmod 755 cookie_set.py
以上實例使用了 Set-Cookie 頭信息來設置Cookie信息,可選項中設置了Cookie的其他屬性,如過期時間Expires,域名Domain,路徑Path。這些信息設置在 "Content-type:text/html"之前。
Cookie信息檢索頁非常簡單,Cookie信息存儲在CGI的環境變量HTTP_COOKIE中,存儲格式如下:
key1=value1;key2=value2;key3=value3....
以下是一個簡單的CGI檢索cookie信息的程序:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 導入模塊 import os import Cookie print "Content-type: text/html" print print """ <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <h1>讀取cookie信息</h1> """ if 'HTTP_COOKIE' in os.environ: cookie_string=os.environ.get('HTTP_COOKIE') c=Cookie.SimpleCookie() c.load(cookie_string) try: data=c['name'].value print "cookie data: "+data+"<br>" except KeyError: print "cookie 沒有設置或者已過去<br>" print """ </body> </html> """
將以上代碼保存到 cookie_get.py,并修改 cookie_get.py 權限:
chmod 755 cookie_get.py
以上 cookie 設置顏色 Gif 如下所示:
HTML設置上傳文件的表單需要設置 enctype 屬性為 multipart/form-data,代碼如下所示:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <form enctype="multipart/form-data" action="/cgi-bin/save_file.py" method="post"> <p>選中文件: <input type="file" name="filename" /></p> <p><input type="submit" value="上傳" /></p> </form> </body> </html>
save_file.py腳本文件代碼如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- import cgi, os import cgitb; cgitb.enable() form=cgi.FieldStorage() # 獲取文件名 fileitem=form['filename'] # 檢測文件是否上傳 if fileitem.filename: # 設置文件路徑 fn=os.path.basename(fileitem.filename) open('/tmp/' + fn, 'wb').write(fileitem.file.read()) message='文件 "' + fn + '" 上傳成功' else: message='文件沒有上傳' print """\ Content-Type: text/html\n <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <p>%s</p> </body> </html> """ % (message,)
將以上代碼保存到 save_file.py,并修改 save_file.py 權限:
chmod 755 save_file.py
以上 cookie 設置顏色 Gif 如下所示:
如果你使用的系統是Unix/Linux,你必須替換文件分隔符,在window下只需要使用open()語句即可:
fn=os.path.basename(fileitem.filename.replace("\\", "/" ))
我們先在當前目錄下創建 foo.txt 文件,用于程序的下載。
文件下載通過設置HTTP頭信息來實現,功能代碼如下:
后面小編會分享更多關于這方面的干貨,感興趣的朋友走一波關注哩~最后附上一張最近很火的支付寶活動福利,掃一掃瓜分15億!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。