一般情況下我們代理設(shè)置是針對(duì)與瀏覽器而言,通常只需在瀏覽器設(shè)置中進(jìn)行配置,但它只針對(duì)瀏覽器有效,對(duì)我們自己編寫的程序并任何效果,這時(shí)就需要我們?cè)谲浖幋a中加入代理設(shè)置。
--- ---
使用Python訪問網(wǎng)頁(yè)一般有三種常用的方式,分別是urllib,urllib2和httplib。其中urllib比較簡(jiǎn)單,功能相對(duì)也比較弱。而httplib簡(jiǎn)單強(qiáng)大,但好像不支持session。所以在Django開發(fā)中一般采用urllib2的方式,即下文所介紹的方式。
urllib2的功能非常強(qiáng)大,在這里就只做其一般使用流程的介紹。
//代理地址PRoxy = "http://10.167.251.83:8080"//設(shè)置代理接口opener = urllib2.build_opener(urllib2.ProxyHandler({'http':proxy}))//進(jìn)行全局代理urllib2.install_opener(opener)//獲取網(wǎng)頁(yè)信息data= urllib2.urlopen(webUrl).read()在設(shè)置全局代理install_opener(opener)之后,好處是后面使用很方便,你可以理解為java中的一個(gè)static方法,配置成功后就無(wú)需再次配置,直接使用即可??杀锥艘搽S之而來(lái),例如:在我的一個(gè)圖書館管理系統(tǒng)項(xiàng)目中,圖書入庫(kù)的信息來(lái)源分為兩處,一處是來(lái)自公司內(nèi)網(wǎng)服務(wù)器,一處是來(lái)自豆瓣第三方服務(wù)器,所以 urllib2的代理設(shè)置需要頻繁的切換。而我一開始的寫法是:
if request.GET.get('json_inner'):   data= urllib2.urlopen(InnerUrl).read()if request.GET.get('json_douban')://外網(wǎng)代理   proxy = "http://10.167.251.83:8080"   opener = urllib2.build_opener(		    urllib2.ProxyHandler({'http':proxy})		    )   urllib2.install_opener(opener)   data= urllib2.urlopen(DoubanUrl).read()這樣就導(dǎo)致程序第一次運(yùn)行是沒有任何問題的,但當(dāng)?shù)诙螆D書信息檢索操作時(shí)由于之前urllib2設(shè)置全局代理install_opener(opener),所以當(dāng)從公司內(nèi)網(wǎng)服務(wù)器獲取圖書信息時(shí)就會(huì)直接從外網(wǎng)進(jìn)行連接,從而導(dǎo)致信息無(wú)法獲取。
最后自己想到一個(gè)可行的折中方案:
//外網(wǎng)代理proxy = "http://10.167.251.83:8080"if request.GET.get('json_inner'):    opener = urllib2.build_opener(		   urllib2.ProxyHandler({'http':proxy})		   ).close()	urllib2.install_opener(opener)    data= urllib2.urlopen(InnerUrl).read()if request.GET.get('json_douban'):    opener = urllib2.build_opener(		    urllib2.ProxyHandler({'http':proxy})		    )	urllib2.install_opener(opener)    data= urllib2.urlopen(DoubanUrl).read()大概的思路就是,每次在進(jìn)行內(nèi)網(wǎng)連接前,都將全局的外網(wǎng)代理設(shè)置進(jìn)行關(guān)閉(調(diào)用close方法),然后在需要訪問外網(wǎng)數(shù)據(jù)時(shí)再將外網(wǎng)代理設(shè)置重新恢復(fù)。
當(dāng)然還有一種更好的方式(我暫時(shí)還未使用過(guò),正確性有待驗(yàn)證),是不使用 install_opener 去更改全局的設(shè)置,而只是直接調(diào)用 opener 的 open 方法代替全局的 urlopen 方法,大家如果感興趣可以實(shí)踐一下。
--- ---
之所以稱之為最后一個(gè)坑是因?yàn)檫@個(gè)“坑”是在發(fā)生在了軟件開發(fā)的收尾階段:部署。
由于我撰寫的Django編碼部分是在window環(huán)境下進(jìn)行,而最后程序的部署環(huán)境是在Ubuntu上的。本不會(huì)出現(xiàn)意外的問題,因?yàn)镻ython是腳本語(yǔ)言跨平臺(tái)的,但部署之后卻發(fā)現(xiàn)無(wú)論urllib2怎么設(shè)置,項(xiàng)目程序始終只能訪問外部網(wǎng)絡(luò)o(︶︿︶)o 。最后發(fā)現(xiàn)原來(lái)是之前Ubuntu為了方便使用,在系統(tǒng)配置文件.bashrc中設(shè)置了全局proxy代理,這就導(dǎo)致了項(xiàng)目軟件程序?qū)⒛J(rèn)從外網(wǎng)連接,urllib2配置將失效。
但問題還沒有結(jié)束,因?yàn)槲覀儼l(fā)現(xiàn)就算改了系統(tǒng)配置文件brash后項(xiàng)目程序仍只能訪問外網(wǎng)程序,然后在繼續(xù)尋找原因,最后萬(wàn)般無(wú)奈之下只能重啟電腦進(jìn)行最后的嘗試,然后程序居然可以正確運(yùn)行了!
后來(lái)問題總結(jié)時(shí)發(fā)現(xiàn):我們解決問題的思路并沒有問題,就是因?yàn)樵谙到y(tǒng)配置文件.bashrc中設(shè)置了全局proxy代理而導(dǎo)致了urllib2配置失效,但關(guān)鍵在于修改了系統(tǒng)配置文件.bashrc后需要進(jìn)行重啟或注銷配置才會(huì)生效?。。∵@是多么痛的感悟,一個(gè)小小的考慮不足就導(dǎo)致幾個(gè)小時(shí)的浪費(fèi),真是個(gè)”大坑“??!
 
  | 
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注