Колба разбитая труба с запросами

Я хочу отправить локальный запрос REST в флеш-приложение, например:

from flask import Flask, url_for, request import requests app = Flask(__name__) @app.route("/<name>/hi", methods=["POST"]) def hi_person(name): form = {"name": name} return requests.post(url_for("hi", _external=True), data=form) @app.route("/hi", methods=["POST"]) def hi(): return 'Hi, %s!' % request.form["name"] 

Отправка curl -X POST http://localhost:5000/john/hi приводит к замораживанию приложения всей флэшки. Когда я посылаю сигнал об ударе, я получаю сообщение об ошибке сбойной трубы. Есть ли способ предотвратить замораживание колбы?

3 Solutions collect form web for “Колба разбитая труба с запросами”

Запустите приложение с флеш-сервером под правильным WSGI-сервером, способным обрабатывать одновременные запросы (возможно, gunicorn или uWSGI ), и он будет работать. Во время разработки включите потоки на сервере, снабженном флажком, с помощью:

 app.run(threaded=True) 

но обратите внимание, что сервер Flask не рекомендуется для использования в производстве.

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

Кстати, под Python 3 реализация socketserver более гибко отключает разъединение и продолжает служить, а не сбой.

Здесь есть несколько вещей, и я постараюсь обратиться к ним один раз в то время.

Во-первых, вы, вероятно, используете сервер разработки игрушек. Этот сервер имеет множество ограничений; главным образом среди этих ограничений, состоит в том, что он может обрабатывать только один запрос за раз. Когда вы создаете второй запрос во время вашего первого запроса, вы блокируете свое приложение: функция requests.post() ожидает, пока Flask ответит, но сама флэшка ждет post() ! Решение этой конкретной проблемы заключается в том, чтобы запустить приложение WSGI в многопоточной или многопроцессорной среде. Я предпочитаю http://twistedmatrix.com/trac/wiki/TwistedWeb для этого, но есть несколько других вариантов.

С этим с дороги … Это антипаттерн. Вы почти наверняка не хотите вызывать все накладные расходы HTTP-запроса, чтобы разделить некоторые функции между двумя представлениями. Правильная вещь – реорганизовать, чтобы иметь отдельную функцию, которая выполняет эту совместную работу. Я не могу реорганизовать ваш конкретный пример, потому что то, что у вас есть, очень простое и на самом деле даже не заслуживает двух видов. Что именно вы хотели построить?

Редактировать: комментарий спрашивает, достаточно ли многопоточного режима на сервере stdlib для игры, чтобы предотвратить возникновение тупика. Я скажу «может быть». Да, если нет каких-либо зависимостей, позволяющих обеим потокам добиться прогресса, и оба потока достигнут достаточного прогресса для завершения своих сетевых задач, то запросы будут выполнены правильно. Тем не менее, определение того, будут ли два потока взаимоблокировать друг друга неразрешимыми (доказательство опущено как тупое), и я не хочу точно сказать, что сервер stdlib может сделать это правильно.

Ошибка, вызвавшая крах, была исправлена ​​в версии 0.12 , выпущенной 21 декабря 2016 года. Да! Это важное решение, которого многие ждали.

Из журнала изменений в фляже:

  • Отмените изменение поведения, которое привело к сбою сервера dev вместо возврата внутренней ошибки сервера (запрос на выгрузку # 2006).
Python - лучший язык программирования в мире.