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 国产激情视频,天堂网www在线资源,国产91精品在线播放

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          CentOS 7環(huán)境下利用pgcluu生成動態(tài)報告(

          CentOS 7環(huán)境下利用pgcluu生成動態(tài)報告(CGI)

          、安裝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)文章,作者:馨苑

          打開微信“掃一掃”,打開網(wǎng)頁后點擊屏幕右上角分享按鈕

          作者

          歡迎專心練劍的產(chǎn)品人和技術(shù)宅來聊:xinyuan@36kr.com :)

          文章評論(3)

          么是CGI

          CGI 目前由NCSA維護(hù),NCSA定義CGI如下:

          CGI(Common Gateway Interface),通用網(wǎng)關(guān)接口,它是一段程序,運行在服務(wù)器上如:HTTP服務(wù)器,提供同客戶端HTML頁面的接口。


          網(wǎng)頁瀏覽

          為了更好的了解CGI是如何工作的,我們可以從在網(wǎng)頁上點擊一個鏈接或URL的流程:

          • 1、使用你的瀏覽器訪問URL并連接到HTTP web 服務(wù)器。
          • 2、Web服務(wù)器接收到請求信息后會解析URL,并查找訪問的文件在服務(wù)器上是否存在,如果存在返回文件的內(nèi)容,否則返回錯誤信息。
          • 3、瀏覽器從服務(wù)器上接收信息,并顯示接收的文件或者錯誤信息。

          CGI程序可以是Python腳本,PERL腳本,SHELL腳本,C或者C++程序等。


          CGI架構(gòu)圖


          Web服務(wù)器支持及配置

          在你進(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
          

          第一個CGI程序

          我們使用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é)束頭部信息。



          HTTP頭部

          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程序都接收以下的環(huán)境變量,這些變量在CGI程序中發(fā)揮了重要的作用:

          以下是一個簡單的CGI腳本輸出CGI的環(huán)境變量:

          將以上點保存為 test.py ,并修改文件權(quán)限為 755,執(zhí)行結(jié)果如下:


          GET和POST方法

          瀏覽器客戶端通過兩種方法向服務(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 請求的其他一些注釋:

          • GET 請求可被緩存
          • GET 請求保留在瀏覽器歷史記錄中
          • GET 請求可被收藏為書簽
          • GET 請求不應(yīng)在處理敏感數(shù)據(jù)時使用
          • GET 請求有長度限制
          • GET 請求只應(yīng)當(dāng)用于取回數(shù)據(jù)

          簡單的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é)果:

          簡單的表單實例:GET方法

          以下是一個通過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方法傳遞數(shù)據(jù)

          使用POST方法向服務(wù)器傳遞數(shù)據(jù)是更安全可靠的,像一些敏感信息如用戶密碼等需要使用POST傳輸數(shù)據(jù)。

          以下同樣是hello_get.py ,它也可以處理瀏覽器提交的POST表單數(shù)據(jù):

          以下為表單通過POST方法(method="post")向服務(wù)器腳本 hello_get.py 提交數(shù)據(jù):

          Gif 演示如下所示:

          通過CGI程序傳遞checkbox數(shù)據(jù)

          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 常用在身份校驗中。

          cookie的語法

          http cookie的發(fā)送是通過http頭部來實現(xiàn)的,他早于文件的傳遞,頭部set-cookie的語法如下:

          Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
          
          • name=name: 需要設(shè)置cookie的值(name不能使用";"和","號),有多個name值時用 ";" 分隔,例如:name1=name1;name2=name2;name3=name3
          • expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
          • path=path: 設(shè)置cookie支持的路徑,如果path是一個路徑,則cookie對這個目錄下的所有文件及子目錄生效,例如: path="/cgi-bin/",如果path是一個文件,則cookie指對這個文件生效,例如:path="/cgi-bin/cookie.cgi"。
          • domain=domain: 對cookie生效的域名,例如:domain="www.runoob.com"
          • secure: 如果給出此標(biāo)志,表示cookie只能通過SSL協(xié)議的https服務(wù)器來傳遞。
          • cookie的接收是通過設(shè)置環(huán)境變量HTTP_COOKIE來實現(xiàn)的,CGI程序可以通過檢索該變量獲取cookie信息。

          Cookie設(shè)置

          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信息檢索頁非常簡單,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億!


          主站蜘蛛池模板: 无码人妻AⅤ一区二区三区| 麻豆国产在线不卡一区二区| 在线免费视频一区二区| 日亚毛片免费乱码不卡一区 | 97精品国产福利一区二区三区| 一区二区三区四区免费视频| 一区二区在线视频观看| 亚洲国产视频一区| 夜色福利一区二区三区| 美女一区二区三区| 免费萌白酱国产一区二区三区| 在线观看精品一区| 亚洲av无码一区二区三区在线播放 | 日韩毛片一区视频免费| 欲色aV无码一区二区人妻| 亚洲国产精品一区| 91香蕉福利一区二区三区| 亚洲熟妇av一区二区三区| 国产一区二区三区夜色| 国产精品免费大片一区二区| 国产在线观看一区二区三区四区| 成人区人妻精品一区二区不卡| 一区二区传媒有限公司| 波多野结衣一区视频在线| 国产精品视频一区麻豆| 亚洲欧美日韩一区二区三区| 亚无码乱人伦一区二区| 亚洲av无码一区二区三区人妖| 无码中文字幕一区二区三区| 亚洲AV无码国产精品永久一区| 午夜爽爽性刺激一区二区视频| 国产香蕉一区二区三区在线视频| 欧美激情国产精品视频一区二区 | AV怡红院一区二区三区| 好爽毛片一区二区三区四| 东京热无码av一区二区| 日韩一区二区三区无码影院| 波多野结衣一区视频在线| 国产成人av一区二区三区不卡| 一区二区三区免费视频观看| 国产高清视频一区三区|