Twisted之web开发(一)

主要概念讲述

Site Objects

  负责创建HTTPChannel实例来解析HTTP请求,也负责运行。包括URL的根部资源。

Recource

  相当于一个单独的URL字段。IResiurce接口负责描述资源对象的方法

  负责定义所有的URL,相当于一个映射表

.rpy scripts

  是twisted.web静态资源服务器会执行的python脚本,类似CGI,但是他必选创建一个Recource对象,在访问URL的时候展示这个对象

Session

  允许你存储一些信息。

 Site

  Site对象作为一个监听HTTP请求的端口和根资源之间的粘合剂

写一个hello world的例子吧

打开浏览器访问8080端口,就可以看到hello world了。

Resource

资源对象代表一个URL实例。在URL解析过程中,getChild调用现在的Resource产生下一个Resource对象。

当到达叶资源的时候(有root根资源,自然能有leaf叶资源:),如果Resource的isLeaf设置为True或者没有更多URL字段,就通过调用render(request),和Django很像。

在资源定位的时候,已经被处理或者没有被处理的URL字段可以在request.prepath和request.postpath查看

path字段会在通过request.postpath的时候被加工,可以在里边查看。

如果URL以“/”结尾,举个例子http://example.com/foo/bar/,最后的URL字段将会是一个空字符串。

举个例子:

Resource tree

其实就是映射表

资源被集中到这里,使用putChild,这个方法把Resource实例放入另一个Resource实例,让它在给定的路径下使用

1 root = Hello()
2 root.putChild('fred', Hello())
3 root.putChild('bob', Hello())

.rpy脚本

拓展名是.rpy的都是python脚本,放置在Twisted web服务的目录中的时候,在访问web的时候执行

一个.rpy脚本必须定义一个变量,resource,这个Resource对象会render到请求。

.rpy文件是非常便捷的,因为他们在每个web请求上执行,所以.rpy只需要刷新页面,就可以查看更改结果

Render

当Twisted web定位到一个叶资源的时候,会执行web请求。一个Resource的render方法会进行输出,返回给浏览器。

  •   返回一个字符串
  • 调用request.write(),如果需要的话,可以调用很多次,之后调用request.finish()返回server.NOT_DONE_YET(带有欺骗性,因为事实上你已经完成了请求,但这个方法是正确的)
  • 请求一个Deferred,返回server.NOT_DOWN_YET,之后调用request.write()和request.finish()

Resource类经常是一个子类,他有便捷方法render.调用self.render_METHOD其中的方法来相应HTTP请求。比如request_GET,request_POST。建议您写Rescouce的时候继承Resource然后执行render_METHOD,而不是调用render本身。账户已,对于某些resource,可以写request_GET=request.POST,万一你需要处理一些字段,而不管他们是GET还是POST

Request encoders

当你使用Resorce的时候,可以把它打包进 EncodingResourceWrapper之中并且传递列表。在处理请求并返回可能的encoder时,通过twisted默认提供的GzipEncoderFactory 类管理gzip压缩。

Session

HTTP是无状态协议,每一个请求响应都是一个独立的单元,它和任何其他请求都有区别,只有通过URL请求才能区分。

request.getSession()会检查是否设置了cookie,如果没有,就创建唯一的会话id,对象,并且存储在站点返回。如果已经存在,就直接返回。

代理

代理把客户端的请求转发给目标服务器。代理通常在内部网络,火这客户端。可以用于缓存,数据包过滤等。

 1 from twisted.web import proxy, http
 2 from twisted.internet import reactor, endpoints
 3 
 4 class ProxyFactory(http.HTTPFactory):
 5     def buildProtocol(self, addr):
 6         return proxy.Proxy()
 7 
 8 endpoint = endpoints.TCP4ServerEndpoint(reactor, 8080)
 9 endpoint.listen(ProxyFactory())
10 reactor.run()

高级配置

twsited的重要配置都是python配置文件实现的。twisted.applicatin.strports.service函数将会用于构建服务实例,是应用监听TCP端口。

1 from twisted.application import internet, service, strports
2 from twisted.web import static, server
3 
4 root = static.File("/var/www/htdocs")
5 application = service.Application('web')
6 site = server.Site(root)
7 sc = service.IServiceCollection(application)
8 i = strports.service("tcp:80", site)
9 i.setServiceParent(sc)

猜你喜欢

转载自www.cnblogs.com/losenine/p/10085199.html