Как заставить серверы WSGI закрывать соединение после каждого ответа?

API для модуля Python wsgiref исключает хоп-хоп заголовки (как определено в RFC 2616).

Мне неясно, как заставить сервер завершить соединение после ответа (так как, кажется, нет способа добавить Connection: close).

Эта проблема возникает при тестировании небольших приложений WSGI и микросервисов Bottle. Звонки из curl блокируются открытыми соединениями из браузера. Я должен щелкнуть обновление браузера, чтобы разорвать соединение, чтобы на ожидающий запрос скручивания могли быть получены ответы.

Очевидно, это должно быть решение на стороне сервера (разорвать соединение после ответа), а не на стороне клиента. Мне неясно, как это реализовать.

1 ответ

Это действительно основано на вашем WSGI-сервере, на котором вы размещаете свой фреймворк. Лучшее решение с бутылкой - провести ее через гевент.

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

Вы можете очистить белизну и конфиги от бутылок, если они не нужны, я держу их там в качестве примера и предлагаю использовать их, если они обращены наружу.

Это чисто асинхронно на каждом соединении.

Другие вопросы по тегам