1

超基本的なhttpツイストフロントエンドの場合。指示がない限り、HTMLが書き戻されないようにするにはどうすればよいですか。

だから、私は以下に私の/zooのURLを持っています。トレースバック、または「そのようなリソースがありません」応答の場合は、接続をドロップするか、空の応答を返します。

非常に単純なものだと思いますが、理解できません:)特定の子パスがなくても実行できることはわかっていますが、効率的に実行したい場合は、できるだけ早く削除したいと思います。たぶんリソースを使用しませんか?

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)
4

1 に答える 1

2

最初にいくつかの基本

twind.webの仕組みは次のとおりです。

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

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

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(path)に登録されると、リソースはそのリソースの子リソースになります。例:

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. これで、r4はパスhttp://../help/deregistration/でサーバーリクエストを実行します

だが

  1. r3はパスhttp://../help/registration/xxx/でリクエストをサーバーします
  2. r3はパスhttp://../help/registration/yyy/でリクエストをサーバーします

解決策について:

サイトをサブクラス化する必要があります

  1. パスがpathElementが空の状態で返されたリソースと完全に一致するかどうかを確認してから、それを処理するか、
  2. 他の側面を処理するためのハンドラーとなるリソースを返します

独自のリソースを作成する必要があります

def render(self, request):
    request.setResponseCode(...)
    return ""
于 2010-11-29T20:16:19.747 に答える