获取 Tornado 请求处理程序中设置的当前响应 headers

Get the current response headers set in a Tornado request handler

Tornado RequestHandler class 有 add_header()clear_header()set_header() 方法。有没有办法只查看当前设置的 header?

我的用例是我正在编写一些实用程序方法以在特定条件下自动设置响应 headers。但是我想添加一些错误检查,以便不添加我不想重复的 header 的重复项。

我想编写大致如下的代码:

class MyHandler(tornado.web.RequestHandler):
    def ensure_json_header(self):
        if not self.has_header_with_key('Content-Type'):
            self.set_header('Content-Type', 'application/json')

    def finish_json(self, data):
        self.ensure_json_header()
        return self.finish(json.dumps(data))

但是Tornado中当然没有has_header_with_key()方法。我怎样才能做到这一点?

编辑:原来这是一个 X-Y 问题。真正的答案是只使用 set_header 而不是 add_header。我将此留给可能遇到类似问题的其他人。

没有记录 api 用于列出响应中存在的 header。

但是有一个 self._headers 私有属性(tornado.httputil.HTTPHeaders 的实例),它基本上是响应中所有 header 的字典。您可以这样做来检查 header:

if 'Content-Type' in self._headers:
    # do something

作为附录,如果您想访问请求的所有 header,您可以执行 self.request.headers.


编辑:看到您的问题后,我在 github 上打开了一个 issue about this;让我们看看会发生什么。

Tornado 将始终设置 Content-Type header,因为它是默认的 headers (https://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.clear)。所以如果你想确保你有一个特定的内容类型集,只需调用 set_header.

如果您想检查响应没有在您的代码中设置header,您必须先重置默认值header,您可以通过实施 set_default_headers 并在那里执行 clear_header(“Content-Type”) 来完成。

但是您也可以通过在处理程序上设置 属性(例如 override_content_type)来实现相同的效果,在代码中设置它,然后在渲染之前执行非条件 set_header结果。