特别是,我想为 4xx 和 5xx 添加 CORS 标头,以便我的前端 Web 应用程序可以向用户显示错误信息。
在我的应用程序中,我有一个
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
资源将流量定向到我的所有叶资源,或者针对 404 错误使用 noresource
?其他错误类型呢?
更新:
评论者请求了解
Root
是什么:
class Root(resource.Resource):
isLeaf = False
def render_GET(self, request):
request.setHeader('Access-Control-Allow-Origin', '*')
return "arkanoid?".encode()
在底层,请求最初由
Resource
的 render
方法处理。因此,覆盖 render
是为任何子资源自定义标题的好方法:
from twisted.web.resource import Resource
class ResourceWithMyHeaders(Resource):
def render(self, request):
# add a custom header
request.setHeader("HeaderName", "HeaderValue")
return super().render(request)
现在您可以使用此类创建一个具有所需标头的子类
Root
:
class Root(ResourceWithMyHeaders):
isLeaf = False
def render_GET(self, request):
# all headers already here
print(request.responseHeaders)
...