Заставить систему подтверждения / обратного вызова на основе хранимой функции работать с несколькими процессами в django + nginx - PullRequest
0 голосов
/ 07 октября 2019

Наша система обратного вызова работала так, что во время запроса, когда вам требовалось больше пользовательского ввода, вы выполняли следующее:

def view(req):
    # do checks, maybe get a variable.
    bar = req.bar()
    def doit():
       foo = req.user
       do_the_things(foo, bar)
    req.confirm(doit, "Are you sure you want to do it")

С этого момента сервер сохранял бы объект функции в словаре с UIDв качестве ключа, который будет отправлен клиенту, где будет показан диалог подтверждения. При нажатии OK другой запрос отправляется в другое представление, которое ищет сохраненный объект функции и запускает его.

Это работает в одном процессе развертывания. Однако при использовании nginx, если пул процессов больше 1, другой процесс получает запрос на подтверждение и, следовательно, не имеет сохраненной функции и не может выполняться.

Мы рассмотрели способы принудительного примененияnginx использует определенный процесс для определенных запросов, но не нашел решения.

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

Может кто-нибудь предложить метод, который позволит нам сохранить функцию для запуска позже, когда запрос на продолжение может поступить из отдельного процесса?

1 Ответ

0 голосов
/ 07 октября 2019

Кажется, нет веской причины использовать здесь обратный вызов, определенный как встроенная функция.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...