【问题标题】:How to get WSGI servers to close a connection after each response?如何让 WSGI 服务器在每次响应后关闭连接?
【发布时间】:2019-05-22 17:53:19
【问题描述】:

Python 的wsgiref module API 排除了hop-by-hop 标头(定义在RFC 2616)。

我不清楚如何让服务器在响应后终止连接(因为似乎没有办法添加Connection: close)。

在测试小型 WSGI 应用和Bottle 微服务时会出现这个问题。来自curl 的呼叫被来自浏览器的打开连接阻止。我必须单击浏览器刷新来终止连接,以便可以回答待处理的 curl 请求。

显然,这应该是服务器端的决定(响应后终止连接)而不是客户端。我不清楚如何实现这一点。

【问题讨论】:

  • 这可能对您的情况有所帮助:stackoverflow.com/questions/38079916/…
  • 感谢@Ajax1234。另一个问题是相关的,但没有触及问题的核心,即“应用程序通知 WSGI 服务器它需要在完成响应后终止会话的正确方法是什么?” connection-close 标头是明确禁止的,所以还有很多其他的交流方式,“这是你的答案,现在我们完成了,再见”。
  • AFAIK,没有办法做到这一点。但是你不能通过使用(例如)gevent 来处理并发请求来达到你的目的吗?

标签: python flask bottle wsgiref


【解决方案1】:

这实际上取决于您托管框架的 WSGI 服务器。使用瓶子的最佳解决方案是通过 gevent 运行它。

botapp = bottle.app()
for Route in (mainappRoute,): #handle multiple files containing routes
    botapp.merge(Route)
botapp = SessionMiddleware(botapp, beakerconfig) #in case you are using beaker sessions
botapp = WhiteNoise(botapp) #in case you want whitenoise to handle static files
botapp.add_files(staticfolder, prefix='static/') #add static route to whitenoise
server = WSGIServer(("0.0.0.0", int(80)), botapp) #gevent async web server
def shutdown():
    print('Shutting down ...')
    server.stop(timeout=60)
    exit(signal.SIGTERM)
gevent.signal(signal.SIGTERM, shutdown)
gevent.signal(signal.SIGINT, shutdown) #CTRL C
server.serve_forever() #spawn the server

如果没有必要,您可以清除白噪声和瓶子配置,我将它们放在那里作为示例,并建议您在朝外时使用它们。

这在每个连接上都是完全异步的。

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 2014-09-08
    • 2021-09-22
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多