设置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的更多相关文章

  1. Django关于设置自定义404和安装debug-toolbar的笔记

    Django关于设置自定义404和安装debug-toolbar的笔记 关于设置404 先做好404页面,然后在views.py文件中做好映射,最后是在urls.py做好路由,而这个urls.py必须 ...

  2. django时区设置(timezone)

    django时区设置(timezone): 默认: TIMEZONE:'America/Chicago'(以前的版本,现在的版本默认的都是UTC时间.) Chicago时间,为UTC/GMT -6 小 ...

  3. django中设置定时任务

    django中设置定时任务 在django中设置定时任务我们可以借用django-crontab这个第三包来实现 django-crontab只能在linux系统下使用 安装: pip install ...

  4. 浅析django的abstract,proxy, managed

    django.db.models.Model 的 Meta参数 参数 类型 说明 继承 abstract boolean 是否建表 不继承,子类自动充值为默认值(False) managed bool ...

  5. 实现代理设置proxy

    用户在哪些情况下是需要设置网络代理呢? 1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网:多个电脑共享上外网,就要用代理: 2.有些网页被封,通过国外的代理就能看到这被封的网站:3. ...

  6. Django数据库设置

    设置数据库,创建您的第一个模型,得到一个简单介绍 Django的自动生成管理网站. 数据库设置 现在,打开 mysite / settings.py . 这是一个普通的Python模块 模块级变量代表 ...

  7. django不要设置datetime字段auto_now=True

    django model的datetime字段如果设置了auto_now=True的话,update该记录的时候即使没有更新它的时间字段,它的时间字段依然会执行一遍auto_now,时间会变成当前更新 ...

  8. 设置Proxy Server和SQL Server实现互联网上的数据库安全

    ◆首先,我们需要了解一下SQL Server在WinSock上定义协议的步骤: 1. 在”启动”菜单上,指向”程序/Microsoft Proxy Server”,然后点击”Microsoft Man ...

  9. Django后台设置--遇到的问题与解决方案

    1. 后台如何管理项目中的models 新建的Django工程会自动引用admin 应用,新建后台可以通过 createsuperuser 命令建立后台admin超级管理员,我遇到的第一个问题,就是如 ...

随机推荐

  1. Intellij IDEA调试

    这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此. 先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 ...

  2. ASP.NET- Web.Config配置大文件上传

    在web.config中的<system.web></system.web>内加入如下代码: <httpRuntime executionTimeout="60 ...

  3. [课堂实践与项目]手机QQ客户端--4期(SQLite的加入,注册,找回,登录界面的修改):建立关于QQ注册类,使用SQLite进行存储,

    经过昨天下午和今天上午的不懈努力,终于通过了SQLite的学习. 我们现在这里定义一个有关SQLIte的封装类,便于我在后面的用户注册,用户密码找回,和登录界面的使用 1.首先我们看看我们建立的use ...

  4. Mina学习之IoSession

    Session(会话)是Mina的核心部分:每当一个clinent连接到server时,都会创建一个新的session,并且保存在内存中知道该链接断开. session 是用来存储一些关于连接信息,加 ...

  5. 服务器后端开发系列——《实战FastDFS分布式文件系统》[转]

    1.FastDFS的配置.部署与API使用解读(1)Get Started with FastDFS 内容:讲解FastDFS的背景.基本原理,并讲述基本的配置.部署和测试的内容. 2.FastDFS ...

  6. RFC 文档(中文与英文)

    http://man.chinaunix.net/develop/rfc/default.htm https://www.rfc-editor.org/retrieve/ http://www.iet ...

  7. 刷leetcode

    目前已经刷到了56题,才到1/3,后面越来越难,不知道能不能在面微软之前刷完.

  8. 墙裂推荐 iOS 资源大全

    这是个精心编排的列表,它包含了优秀的 iOS 框架.库.教程.XCode 插件.组件等等. 这个列表分为以下几个部分:框架( Frameworks ).组件( Components ).测试( Tes ...

  9. 仿QQ迷你首页(VC++,MFC)(迷你资讯)的开发与实现(源代码)

    由于需求,需要写个类似QQ迷你资讯首页的东西,就花了一点时间写了写,软件效果截图如下: 程序的主要核心代码如下: 程序的全部源代码下载地址:http://download.csdn.net/downl ...

  10. Go语言学习资料汇总

    网站: Go语言官网(访问)(中文镜像) Go语言中文网(访问) Go编译器(访问) Go语言中国社区(访问) golanghome(访问) GoLang中国(访问) Gopher Academic( ...