Django如何设置proxy
2015-03-02 16:42
141 查看
设置porxy的原因
一般情况下我们代理设置是针对与浏览器而言,通常只需在浏览器设置中进行配置,但它只针对浏览器有效,对我们自己编写的程序并任何效果,这时就需要我们在软件编码中加入代理设置。--- ---
Django的代理设置
使用Python访问网页一般有三种常用的方式,分别是urllib,urllib2和httplib。其中urllib比较简单,功能相对也比较弱。而httplib简单强大,但好像不支持session。所以在Django开发中一般采用urllib2的方式,即下文所介绍的方式。urllib2的功能非常强大,在这里就只做其一般使用流程的介绍。
//代理地址 proxy = "http://10.167.251.83:8080" //设置代理接口 opener = urllib2.build_opener(urllib2.ProxyHandler({'http':proxy})) //进行全局代理 urllib2.install_opener(opener) //获取网页信息 data= urllib2.urlopen(webUrl).read()
关于install_opener(opener)的问题产生
在设置全局代理install_opener(opener)之后,好处是后面使用很方便,你可以理解为Java中的一个static方法,配置成功后就无需再次配置,直接使用即可。可弊端也随之而来,例如:在我的一个图书馆管理系统项目中,图书入库的信息来源分为两处,一处是来自公司内网服务器,一处是来自豆瓣第三方服务器,所以 urllib2的代理设置需要频繁的切换。而我一开始的写法是:if request.GET.get('json_inner'): data= urllib2.urlopen(InnerUrl).read() if request.GET.get('json_douban'): //外网代理 proxy = "http://10.167.251.83:8080" opener = urllib2.build_opener( urllib2.ProxyHandler({'http':proxy}) ) urllib2.install_opener(opener) data= urllib2.urlopen(DoubanUrl).read()
这样就导致程序第一次运行是没有任何问题的,但当第二次图书信息检索操作时由于之前urllib2设置全局代理install_opener(opener),所以当从公司内网服务器获取图书信息时就会直接从外网进行连接,从而导致信息无法获取。
最后自己想到一个可行的折中方案:
//外网代理 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()
大概的思路就是,每次在进行内网连接前,都将全局的外网代理设置进行关闭(调用close方法),然后在需要访问外网数据时再将外网代理设置重新恢复。
当然还有一种更好的方式(我暂时还未使用过,正确性有待验证),是不使用 install_opener 去更改全局的设置,而只是直接调用 opener 的 open 方法代替全局的 urlopen 方法,大家如果感兴趣可以实践一下。
--- ---
最后一个“坑”
之所以称之为最后一个坑是因为这个“坑”是在发生在了软件开发的收尾阶段:部署。由于我撰写的Django编码部分是在window环境下进行,而最后程序的部署环境是在Ubuntu上的。本不会出现意外的问题,因为Python是脚本语言跨平台的,但部署之后却发现无论urllib2怎么设置,项目程序始终只能访问外部网络o(︶︿︶)o 。最后发现原来是之前Ubuntu为了方便使用,在系统配置文件.bashrc中设置了全局proxy代理,这就导致了项目软件程序将默认从外网连接,urllib2配置将失效。
但问题还没有结束,因为我们发现就算改了系统配置文件brash后项目程序仍只能访问外网程序,然后在继续寻找原因,最后万般无奈之下只能重启电脑进行最后的尝试,然后程序居然可以正确运行了!
后来问题总结时发现:我们解决问题的思路并没有问题,就是因为在系统配置文件.bashrc中设置了全局proxy代理而导致了urllib2配置失效,但关键在于修改了系统配置文件.bashrc后需要进行重启或注销配置才会生效!!!这是多么痛的感悟,一个小小的考虑不足就导致几个小时的浪费,真是个”大坑“啊!
查看原文:http://www.xyczero.com/blog/article/4/.
相关文章推荐
- Django如何设置proxy
- Django 当中使用CSS之类的东西如何设置路径
- Django 1.6 最佳实践: 如何正确的使用和设置Database和Model
- axios异步请求如何设置通过django的csrf验证
- 编写Java application时,如何设置proxy的信息
- 【Django】Django 如何使用 Django设置的日志?
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
- Squid-Squid 多层Cache 如何设置实现墙内直连,墙外域名走国外Proxy - 德问:编程社交问答
- django如何设置连接mysql数据库
- 如何为Docker build设置http_proxy
- [urls.py设置技巧]Django是如何处理URLconf的?
- Django 当中使用CSS之类的东西如何设置路径
- 如何设置代理页面(Proxy)
- Proxy SwitchySharp如何设置自动切换代理
- django:DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用
- Django存在多个数据库时如何设置表单提交的数据库
- 如何在sae中设置django,让sae的工作环境跟本地python环境一致
- Django 1.6 最佳实践: 如何设置和使用 Log(转)