1. 程式人生 > >Twisted之web開發(一)

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)