如何为Twisted服务器的错误响应设置自定义标头?

时间:2019-01-29 20:40:19

标签: cors twisted twisted.web

特别是,我想为4xx和5xx添加CORS标头,以便前端Webapp可以向用户显示错误信息。

在我的应用程序中,我有一个root资源,并使用putChild添加了叶子资源。例如:

root = Root()
proxy = Proxy()
root.putChild("".encode('utf-8'), Root())
root.putChild("proxy".encode('utf-8'), proxy)
proxy.putChild("listMonitors".encode('utf-8'), ListMonitors())
proxy.putChild("getMonitorValues".encode('utf-8'), GetMonitorValues())
proxy.putChild("setStartInstrument".encode('utf-8'), SetStartInstrument())
proxy.putChild("setStopInstrument".encode('utf-8'), SetStopInstrument())
proxy.putChild("setPowerOnInstrument".encode('utf-8'), SetPowerOnInstrument())
proxy.putChild("setPowerOffInstrument".encode('utf-8'), SetPowerOffInstrument())

site = server.Site(root)

This在Twisted文档中似乎很相关,并且可能允许在响应中设置标头,但是我不确定如何应用它。我是否需要放弃putChild方法,而转而让root资源将流量直接定向到我所有的叶子资源或noresource,以解决404错误?那其他错误类型呢?

更新:

评论者要求提供有关Root是什么的信息:

class Root(resource.Resource):
    isLeaf = False

    def render_GET(self, request):

        request.setHeader('Access-Control-Allow-Origin', '*')
        return "arkanoid?".encode()

1 个答案:

答案 0 :(得分:0)

Twisted Web无法提供定义站点范围错误处理行为的功能。它确实使您可以定义使用twisted.web.static.File服务的基于文件系统的静态内容的403和404行为,但这似乎对您的情况没有帮助。

最简单的解决方案可能是使用Klein来定义您的网络行为。 Klein确实提供了您感兴趣的error customization behavior类型。由于Klein基于Twisted,并且可以与Twisted Web很好地配合使用,因此您可以根据自己的喜好将任意多或少的Web应用程序切换到该应用程序。其余使用Twisted Web。您所有其他Twisted工具和库也将继续与之一起工作。