2010-11-29 9 views
1

超基本的なHTTPのツイストペアのフロントエンドの場合。 私はそれを伝えない限り、どのようなhtmlも書かれていないことを確認する方法を教えてください。Twisted.webからのすべてのデフォルトリソース/応答をオーバーライドします。

私は/ zooの下にURLを持っています。 トレースバックや 'No such Resource'レスポンスの場合は、接続を切断するか、空のレスポンスを返すだけです。

私はそれは非常にシンプルなものだと思うけど、それを理解することはできません:) 私は自分の特定の子供のパスを持っていないことができますが、それを効率的にやりたい、できるだけ早く..リソースを使用しないかもしれませんか?

class HttpApi(resource.Resource): 
    isLeaf = True 
    def render_POST(self, request): 
     return "post..." 


application = service.Application("serv") 

json_api = resource.Resource() 
json_api.putChild("zoo", HttpApi()) 
web_site = server.Site(json_api) 
internet.TCPServer(8001, web_site).setServiceParent(application) 

答えて

2

最初のいくつかの基本twisted.webの仕組みは、HTTPの工場でSiteというクラスがあり

です。 これはすべての要求に対して呼び出されます。実際には、getResourceForという関数が呼び出され、この要求を処理する適切なリソースを取得します。 このサイトクラスはrootリソースで初期化されています。そして、ルートリソースにresource.getChildForRequestを呼び出しSite.getResourceFor機能が

コールフローは次のとおりです。

Site.getResourceFor -

今では見て時間です> resource.getChildForRequest(ルートリソース) getChildForRequest時:

def getChildForRequest(resource, request): 
    """ 
    Traverse resource tree to find who will handle the request. 
    """ 
    while request.postpath and not resource.isLeaf: 
     pathElement = request.postpath.pop(0) 
     request.prepath.append(pathElement) 
     resource = resource.getChildWithDefault(pathElement, request) 
    return resource 

資源がputChild(パス)に登録されているとして何が起こることは、彼らはCHILになっていますそのリソースのd個のリソース。 例:

root_resource 
| 
|------------ resource r1 (path = 'help') 
|----resource r2 (path = 'login') | 
|         |----- resource r3 (path = 'registeration') 
|         |----- resource r4 (path = 'deregistration') 

いくつかの反射:

  1. 今R1意志パスを持つサーバ要求http://../help/
  2. 今R3するパスを持つサーバ要求http://../help/registration/
  3. パス http://../help/deregistration/
  4. 今R4意志サーバ要求

しかし

  1. R3するパスを持つサーバ要求http://../help/registration/xxx/
  2. R3するソリューションのパスhttp://../help/registration/yyy/

とサーバ要求:

あなたがサイトのサブクラスを作成する必要があります。

  1. チェックパスがexcatlyリソースが空pathElementで返さだけにして、それか
  2. リターン他の側面

あなたがあなた自身のリソースを作成する必要がありますを処理するために、あなたのハンドラになり、リソースを処理一致する場合

def render(self, request): 
    request.setResponseCode(...) 
    return "" 
関連する問題