1

对于一个超基本的 http 扭曲前端。除非我告诉它,否则我如何确保没有 html 被写回。

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

我想这是一个超级简单的,但无法弄清楚:) 我知道我可以通过没有我的特定子路径来做到这一点,但想要高效地做到这一点,只想尽早放弃它..也许不使用资源?

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

先说一些基础知识

twisted.web 的工作方式是

有一个名为Site的类,它是一个 HTTP 工厂。每次请求都会调用它。实际上,调用了一个名为 getResourceFor 的函数来获取为该请求提供服务的适当资源。这个站点类是用根资源初始化的。并且函数 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/服务器请求

对于解决方案:

您需要将 Site 子类化为

  1. 检查路径是否与 pathElement 为空返回的资源完全匹配,然后才处理它或
  2. 返回一个资源,它将成为您处理其他方面的处理程序

您将必须创建自己的资源

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