覆盖Twisted.web中的所有默认资源/响应

时间:2010-11-29 19:31:48

标签: python twisted twisted.web

对于超级基本的http扭曲前端。 除非我告诉你,否则我怎么能确保没有回写任何HTML。

所以,我在下面有我的/ zoo网址。 对于任何回溯或“无此类资源”响应,我只想删除连接或返回空响应。

我想这是一个非常简单的但是无法弄清楚:) 我知道我可以通过没有我特定的Child路径来做到这一点,但是想要有效率地做,只想尽早放弃它。也许不使用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)

1 个答案:

答案 0 :(得分:2)

  

首先是一些基础

twisted.web的工作方式是

有一个名为Site的类,它是一个HTTP工厂。 每个请求都会调用此方法。事实上,调用一个名为getResourceFor的函数来获取将为此请求提供服务的适当资源。 此Site类使用root资源初始化。并且函数Site.getResourceFor在根资源上调用resource.getChildForRequest

呼叫流程为:

  

Site.getResourceFor - > resource.getChildForRequest(root资源)

现在是时候看看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. 进行服务器请求
  3. 现在r3将通过路径http://../help/registration/
  4. 进行服务器请求
  5. 现在r4将通过路径http://../help/deregistration/
  6. 进行服务器请求

    但是

    1. r3将使用路径http://../help/registration/xxx/
    2. 进行服务器请求
    3. r3将使用路径http://../help/registration/yyy/
    4. 进行服务器请求
        

      对于解决方案:

      您需要将Site子类化为

      1. 检查路径是否与pathElement为空返回的资源非常匹配,然后才处理它或
      2. 返回一个资源,该资源将成为处理其他方面的处理程序
      3. 您必须创建自己的资源

        def render(self, request):
            request.setResponseCode(...)
            return ""