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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM