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)