【问题标题】:Override all default resources / responses from Twisted.web覆盖来自 Twisted.web 的所有默认资源/响应
【发布时间】:2010-11-29 19:31:47
【问题描述】:

用于超基本的 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)

【问题讨论】:

    标签: python twisted twisted.web


    【解决方案1】:

    先了解一些基础知识

    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/ 来处理请求

    解决办法:

    您需要将站点子类化为

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

    您必须创建自己的资源

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

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 1970-01-01
      • 2016-09-21
      • 2015-10-27
      • 2017-01-17
      • 2017-05-02
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多