Ajac Call заблокирован - Web2py Framework
У меня есть веб-приложение, которое работает на хосте A, оно запускает несколько команд на другом хосте B, и я хочу отобразить вывод команд, запущенных на B, на веб-странице, присутствующей на A, т.е. я хочу создать вид живого потоковая передача консоли B на веб-странице, представленной на A.
Для этого я перенаправил вывод консоли B в сокет на A и сохранил вывод в файле на A.
Я запускаю ajax-вызов, который инициирует процесс (с использованием контроллера web2py) для запуска в B. Этот ajax-вызов также обрабатывает перенаправление консоли B на сокет A.
С веб-страницы я запускаю другой ajax, который читает файл, в котором хранятся данные сокета.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю ajax-вызов secodn, он не возвращается на веб-страницу до тех пор, пока не будет возвращен первый ajax-вызов.
Я хочу знать, что это правильный способ сделать это. Также я хочу знать, что проблема, с которой я сталкиваюсь, связана с ajax или web2py framework?
1 ответ
По умолчанию файл сеанса блокируется при каждом запросе, поэтому новый запрос от того же клиента блокируется до тех пор, пока предыдущий запрос не будет завершен и файл сеанса не будет разблокирован (см. Здесь). Чтобы избежать этой проблемы, вы можете сделать одно из следующего:
В коде вашего приложения, когда приходит запрос на функцию Ajax, немедленно вызовите
session.forget(response)
, Это разблокирует файл сеанса (и, следовательно, предотвратит сохранение сеанса для этого запроса). Вы можете включить эту строку в начале самой функции Ajax или включить ее ранее в файл модели:if request.function in [list, of, ajax, functions]: session.forget(response)
Сохраняйте сеансы в базе данных или в файлах cookie, и в этом случае файлы сеансов не будут заблокированы.
- Если вы не используете систему перезаписи на основе параметров, вы можете использовать систему перезаписи на основе шаблонов, чтобы отключить автоматическое подключение сеанса для определенных маршрутов. В rout_in вместо указания стандартного 2-кортежа вы можете указать 3-кортеж. Первые два элемента кортежа как обычно (входящий шаблон и переписанный шаблон), а третий элемент должен быть
dict(web2py_disable_session=True)
, Это не позволит фреймворку автоматически подключать сеанс для этого маршрута (вы все равно можете вручную подключить сеанс в коде своего приложения). Теоретически, это немного более эффективно, чем первый вариант, потому что он вообще не позволяет заблокировать файл сеанса (с первым параметром платформа по-прежнему первоначально блокирует файл сеанса, а затем код приложения разблокирует его чуть позже).,