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