主要概念讲述
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)