原创博文,转载请注明出处

这一章我们学习利用twisted建立web 客户端。

twisted.web.client.getPage用来异步下载一个页面,并且返回一个deferred
from twisted.internet import reactor
from twisted.web.client import getPage
import sys def printPage(result):
print result def printError(failure):
print >>sys.stderr,failure def stop(result):
reactor.stop() if len(sys.argv)!=2:
print >>sys.stderr,"Usage: python 5-1.py<URL>"
exit(1) d=getPage(sys.argv[1])
d.addCallbacks(printPage,printError)
d.addBoth(stop) reactor.run()

在控制台下我们执行 python 5-1.py http://www.baidu.com/ 就会把整个页面下载下来并以字符串形式输出。

twisted.web.client.downloadPage用来异步下载一个页面并保存为文件,
from twisted.internet import reactor
from twisted.web.client import downloadPage
import sys def printError(failure):
print >>sys.stderr,failure def stop(result):
reactor.stop() if len(sys.argv)!=3:
print >>sys.stderr,"Usage: python 5-2.py<URL><output file>"
exit(1) d=downloadPage(sys.argv[1],sys.argv[2])
d.addErrback(printError)
d.addBoth(stop) reactor.run()

测试: 执行python 5-2.py http://www.baidu.com/ baidu.html ,数据保存在与5-2.py 同目录下的baidu.html文件中

getPage() 和 downloadPage() 在应付一些小工作时还可以,但是我们Twisted 主要的HTTP  Client API 还是Agent 接下来我们学习Agent的用法

from twisted.internet import reactor
from twisted.internet.defer import Deferred
from twisted.internet.protocol import Protocol
from twisted.web.client import Agent
import sys class ResourcePrinter(Protocol):
def __init__(self,finished):
self.finished=finished def dataReceived(self,data):
print data def connectionLost(self,reason):
self.finished.callback(None) def printResource(response):
finished=Deferred()
response.deliverBody(ResourcePrinter(finished))
return finished def printError(failure):
print >>sys.stderr, failure def stop(result):
reactor.stop() if len(sys.argv)!=2:
print >>sys.stderr,"Usage: python 5-3.py URL"
exit(1) agent=Agent(reactor)
d=agent.request('GET',sys.argv[1])
d.addCallbacks(printResource,printError)
d.addBoth(stop) reactor.run()

Agent的初始化需要参数reactor,agent.request(self,method,url,headers=None,bodyProducer=None)headers是请求头,bodyProducer是一个用来生成请求body的对象,本函数用来产生一个请求,返回一个由该请求引发的deferred。

然后我们注册一个callback和errorback去处理请求,response.deliverBody 注册一个 IProtocol provider 来接收 response body.因为响应在网络中是以信息块的形式,所以我们构造一个Protocol来处理数据。为了能够在ResourcePrinter之外还能够处理事件,我们在ResourcePrinter初始化的时候构造了一个deferred,它在连接停止以后触发,并且通过printResource返回。

最后结果和5-1.py(笔记第一个程序)一样。

恢复响应元数据:

Agent支持所有的HTTP 方法和任意HTTP头。由agent.request返回的deferred包含很多有用的HTTP元数据,比如HTTP status code, HTTP version, and headers。

import sys
from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers def printHeaders(response):
print 'HTTP version',response.version
print 'Status code',response.code
print 'Status phrase',response.phrase
print 'Response headers:'
for header, value in response.headers.getAllRawHeaders():
print header,value def printError(failure):
print >>sys.stderr, failure def stop(result):
reactor.stop() if len(sys.argv)!=2:
print >>sys.stderr, "Usage: python 5-4.py URL"
exit(1) agent=Agent(reactor)
headers=Headers({'User-Agent':['Twisted WebBot'],
'Content-Type':['text/x-greeting']})#为什么是列表? d=agent.request('HEAD',sys.argv[1],headers=headers)
d.addCallbacks(printHeaders,printError)
d.addBoth(stop) reactor.run()

测试: 执行python 5-4.py http://www.baidu.com/ baidu.html  我们可以得到来自百度服务器端的响应信息。

利用Agent 发生HTTP数据:

首先我们介绍Producer和Consumer:高效大数据流 (下面解释的不是很清楚,因为我自己也是属于半懂阶段)

Push Producers 如果没有外界的制止,它会一直产生数据,API通过IPushProducer接口定义。有三个方法 pauseProducing()  resumeProducing() stopProducing()

Pull Producers 对于一个明确的请求的响应中产生一系列的数据,其API通过IPullProducer接口定义,有两个方法 resumeProducing() stopProducing(),只有resumeProducing() 被调用,一个Pull Producer 才产生数据。

Consumer 就是数据的去处,也就是接收数据的地方,它由两个接口IConsumer和IFinishableConsumer定义。其中IConsumer有三个方法:registerProducer(producer,streaming), unregisterProducer(),write(data), IFinishableConsumer则增加了finish()

在下面的例子中 ,我们用到了IBodyProducer(IPushProducer),其作用是把数据写进一个用write方法的IConsumer中,在初始化过程中我们必须定义length属性即数据的长度,在startProducing() 方法中如果所有数据写入完毕或者生成的数据有问题将会返回一个由None引发的Deferred。本例中我们用succeed(None)实现。

import sys
from twisted.internet import reactor
from twisted.internet.defer import Deferred,succeed
from twisted.internet.protocol import Protocol
from twisted.web.client import Agent
from twisted.web.iweb import IBodyProducer from zope.interface import implements class StringProducer(object):
implements(IBodyProducer) def __init__(self,body):
self.body=body
self.length=len(body) def startProducing(self,consumer):
consumer.write(self.body)
return succeed(None) def pauseProducing(self):
pass def stopProducing(self):
pass class ResourcePrinter(Protocol):
def __init__(self,finished):
self.finished=finished def dataReceived(self,data):
print data def connectionLost(self,reason):
self.finished.callback(None) def printResource(response):
finished=Deferred()
response.deliverBody(ResourcePrinter(finished))
return finished def printError(failure):
print >>sys.stderr, failure def stop(result):
reactor.stop() if len(sys.argv)!=3:
print >>sys.stderr,"Usage: python 5-5.py URL 'POST DATA'"
exit(1) agent=Agent(reactor)
body=StringProducer(sys.argv[2])
d=agent.request('POST',sys.argv[1],bodyProducer=body)
d.addCallbacks(printResource,printError)
d.addBoth(stop) reactor.run()

我们再构造一个服务器端,其作用是把客户端推送过来的数据进行反转处理。

from twisted.internet import reactor
from twisted.web.resource import Resource
from twisted.web.server import Site class TestPage(Resource):
isLeaf=True
def render_POST(self,request):
return request.content.read()[::-1] resource=TestPage()
factory=Site(resource)
reactor.listenTCP(8000,factory) reactor.run()

我们分别在两个控制台下输入命令

python 5-6.py 这是服务器端

python 5-5.py http://127.0.0.1:8000 nihao

我们会得到 oahin的输出。

twisted学习笔记No.3 Web Clients的更多相关文章

  1. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  2. Spring实战第八章学习笔记————使用Spring Web Flow

    Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...

  3. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  4. 【学习笔记】移动Web手册(PPK力作)

    又是好久没写博客了,最近把近半年的总结,全部总结到博客园吧.先写最近的一个移动端的学习笔记.毕竟移动端开发了一段时间,就写一写读<移动web手册>中,对我感触比较深的几个点—— 一.浏览器 ...

  5. Ruby学习笔记4: 动态web app的建立

    Ruby学习笔记4: 动态web app的建立 We will first build the Categories page. This page contains topics like Art, ...

  6. 《从零开始学Swift》学习笔记(Day2)——使用Web网站编写Swift代码

    Swift 2.0学习笔记——使用Web网站编写Swift代码 原创文章,欢迎转载.转载请注明:关东升的博客 Swift程序不能在Windows其他平台编译和运行,有人提供了一个网站swiftstub ...

  7. twisted学习笔记 No.1

    原创博文,转载请注明出处 . 1.安装twisted ,然后安装PyOpenSSL(一个Python开源OpenSSL库),这个软件包用于给Twisted提供加密传输支持(SSL).最后,安装PyCr ...

  8. tornado 学习笔记2 Python web主流框架

    2.1 Django 官方网址:https://www.djangoproject.com/ 简介:Django is a high-level Python Web framework that e ...

  9. twisted学习笔记 No.2 WebServer

    原创博文,转载请注明出处. 当服务器接收到一个客户端请求后,会创建一个请求对象并传递到资源系统,资源系统会根据请求路径分发到相应的资源对象,资源被要求渲染自身并返回结果到客户端. 解析HTTP Req ...

随机推荐

  1. 鸟哥的私房菜上 xpenguins 设备(ubuntu 12.04)

    看了一个暑假linux,我觉得很辛苦啊,要很好地利用linux并不是的easy... 今天装了一下鸟哥课后给的xpenguins软件,就是桌面特性软件.会有非常多企鹅下落,本以为能够非常轻松的搞定.没 ...

  2. oracle_查询Oracle正在执行和执行过的SQL语句

    ---正在执行的select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT  from v$session a, v$sqlarea b where a.s ...

  3. iterm2 快捷键大全 Mac item2常用快捷键

    整理使用 iTerm 2 过程中得常用快捷键,Mac 原来自带的终端工具 Terminal 不好用是出了名的,虽然最近几个版本苹果稍微做了些优化,功能上,可用性方面增强不少,无奈有个更好用的 Iter ...

  4. iOS根据获取的月和日星座名称

    /** * 依据月和日的下标获取星座名 * * @param monthIndex 月的下标 * @param dayIndex 日的下标 * * @return 星座名 */ - (NSString ...

  5. Spring + Spring MVC + Hibernate

    Spring + Spring MVC + Hibernate项目开发集成(注解) Posted on 2015-05-09 11:58 沐浴未来的我和你 阅读(307) 评论(0) 编辑 收藏 在自 ...

  6. JavaScript闭包的一些理解

    原文:JavaScript闭包的一些理解 简单一点的说:闭包就是能够读取其他函数内部变量的函数.那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那 ...

  7. 如何快速正确的安装 Ruby, Rails 运行环境

    如何快速正确的安装 Ruby, Rails 运行环境 https://ruby-china.org/wiki/install_ruby_guide 对于新入门的开发者,如何安装 Ruby, Ruby ...

  8. netty 3.9.2 UDP协议服务器和客户端DEMO

    说明:基于netty 3.9.2的udp协议实现的(如果你使用的版本是4.X或5.X,请参考其他方法):程序的逻辑结构是,客户端发送给服务端一串数据,服务器端返回给客户端“A”.在进行游戏开发时需要对 ...

  9. 浅谈 js 字符串 trim 方法之正则篇

    原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等 ...

  10. CentOS修改用户密码方法

    CentOS修改用户密码方法 CentOS修改用户密码方法 1. 普通用户 a. 获取超级用户root权限 命令:su或者su -或者su - root b. passwd 用户名 2. 超级用户 a ...