Альтернатива Ajax Call - PullRequest
0 голосов
/ 14 июня 2019

Я делаю вызов ajax для выполнения скрипта Python.Я использую флягу рамки для этого.Переходит по URL, выполняет скрипт и возвращает ответ.Но выполнение сценария python может занять около 10 секунд и вернуть ответ.До этого, если пользователь закрывает или перезагружает вкладку, вызов ajax и выполнение скрипта прерываются.Конечно, я этого не хочу.Итак, я ищу альтернативу этому или любое предложение, чтобы до запуска сервера выполнение скрипта Python было завершено, даже если вкладка закрыта или перезагружена.

Файл колбы:

@app.route('/<contest_id>/<task_id>/submit')
def submit(contest_id, task_id):
    response = os.popen("python3 static/submit.py "+contest_id+" "+task_id).read()
    return response

Ajax Call:

$.ajax({
    type: "GET",
    url: "/"+contest_id+"/"+task_id+"/submit",
    success: function(response) {
        // do something
    }
});

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Распространенным решением для таких проблем является использование Celery. С помощью сельдерея вы можете запускать асинхронные задачи, не дожидаясь результатов. Это в основном очередь, используемая для запуска задач в фоновом режиме. Вы можете запустить задание и дождаться его завершения. Задача продолжает выполняться, даже если браузер закрыт. При правильных настройках вы можете сохранить результаты в базе данных для последующей проверки.

Есть несколько хороших уроков по использованию сельдерея ( Использование сельдерея с колбой ). Сельдерей часто используется с Redis и Rabbitmq

0 голосов
/ 14 июня 2019

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

navigator.sendBeacon(url, data);

Однако есть еще несколько браузеров, которые не поддерживают его .

Если вам нужен ответ, альтернативы AJAX (или переходу страницы) нет.


Однако ваша работа submit не должна быть прервана, если вы ее запросите.Конечно, вы не получите ответ, если пользователь отмотает вашу страницу, но колба должна завершить работу.Попробуйте это:

import time
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    with open('woo1', 'w') as w: pass
    time.sleep(60)
    with open('woo2', 'w') as w: pass
    return "Hello World!"

Перейдите к http://localhost:5000 и затем, пока не истечет минута, отойдите;через минуту вы должны найти в своем каталоге woo1 и woo2.

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