国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Django如何設(shè)置proxy

2019-11-14 17:35:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

設(shè)置porxy的原因

一般情況下我們代理設(shè)置是針對(duì)與瀏覽器而言,通常只需在瀏覽器設(shè)置中進(jìn)行配置,但它只針對(duì)瀏覽器有效,對(duì)我們自己編寫的程序并任何效果,這時(shí)就需要我們?cè)谲浖幋a中加入代理設(shè)置。
--- ---

Django的代理設(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()

關(guān)于install_opener(opener)的問題產(chǎn)生

在設(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è)“坑”

之所以稱之為最后一個(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è)”大坑“??!

查看原文:http://www.xyczero.com/blog/article/4/.


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 花莲县| 高邮市| 乌鲁木齐县| 屏南县| 兴安县| 枞阳县| 宁夏| 遵化市| 酒泉市| 岳西县| 垦利县| 耿马| 康乐县| 浦东新区| 仁怀市| 阳东县| 新密市| 辽中县| 平泉县| 通海县| 集贤县| 宁南县| 新宁县| 山东省| 永登县| 绥芬河市| 苍梧县| 通江县| 永川市| 松江区| 长治市| 龙井市| 武宣县| 大方县| 革吉县| 广饶县| 日照市| 浪卡子县| 虎林市| 阿尔山市| 长沙市|