【问题标题】:How to close the connection如何关闭连接
【发布时间】:2016-06-29 05:41:21
【问题描述】:

我正在将一个简单的工具集从 python 2.7 迁移到 3.5,其中一个工具是使用 web.py 的简单 Web 服务器。

不幸的是 web.py 还不能用于 3.5,所以我为此切换到了 bottle.py。

根据我正在创建的接口规范,我需要通过添加以下行来关闭我可以在 web.py 中轻松完成的连接:

web.header('Connection', 'close')

但是使用瓶子时,当我执行以下操作时,我会收到不允许逐跳标头的错误:

response.add_header('Connection', 'close')

无论如何,如何将此标头添加到响应中?我已经阅读了瓶子文档,在线搜索并查看了瓶子代码。

【问题讨论】:

  • Bottle 是一个 WSGI 框架,WSGI protocol 明确禁止设置逐跳标头:Applications and middleware are forbidden from using HTTP/1.1 "hop-by-hop" features or headers。也许您可以说服 http 服务器设置标头。但是你确定你需要手动设置,http服务器不应该已经处理了吗?还是您正在处理的一些自定义 http 协议?
  • 这实际上解释了很多。但是我需要将标头中的 Connection: close 发送给客户端,其基本原因是某些客户端无法正确处理响应。
  • 你使用内置的瓶子开发服务器吗?您可能应该只将其用于开发。
  • 它只是一个测试工具,它直接从开发环境运行,所以是的,我确实使用内置服务器。
  • 那么我认为你必须使用我概述的方法。如果您使用了应该可以配置的 nginx 之类的东西(例如,请参阅 here 虽然我不知道这是否也适用于您的特殊情况)。

标签: python http-headers bottle


【解决方案1】:

我不确定,所以对我写的东西持保留态度。

bottle 开发服务器是一个轻微修改的 wsgiref 服务器,它是一个轻微修改的 http.server 服务器。它没有简单的方法或配置来发送“不寻常的”标头。您可以将其子类化并编写一些自定义代码。我认为覆盖 send_head 方法 (here) 并在某处包含 self.send_header("Connection", "close") 就足够了。

您可以将 bottly 与您喜欢的任何 wsgi 服务器一起使用。它对相当多的服务器具有内置支持,但任何 wsgi 服务器都应该能够为该应用程序提供服务。也许其他服务器有更简单的方法来发送自定义标头。

此外,http.server 不适合生产,因此即使您可以使标头正常工作,您也可能需要更改它。如果它仅用于内部使用,您可能会使用它。

【讨论】:

  • 事实证明这是正确的答案,Bottle 似乎主动阻止设置它,因为它不是 wsgi 协议的一部分,这应该在服务器本身中设置,而不是在运行的应用程序中服务器。
猜你喜欢
  • 2019-07-27
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多