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