Прежде всего, это проблема с некоторыми конкретными браузерами (и, вероятно, длительная обработка на стороне сервера), не проблема в django.
Из сообщения об ошибке в django:
Это распространенная ошибка, которая возникает, когда ваш браузер закрывает соединение, пока сервер разработки все еще занят отправкой данных. Лучшее, что мы могли бы сделать, это иметь более явное сообщение об ошибке.
На самом деле это может происходить в других системах, например, из cherrypy
Не о чем беспокоиться, так как это означает, что клиент закрыл соединение до сервера. После этой трассировки ваш сервер CherryPy будет продолжать работать в обычном режиме.
Итак, это введение в ваш первый вопрос:
- Кто-нибудь может объяснить (или угадать), в чем вообще ошибка?
Ну, это просто браузер, закрывающий соединение - своего рода тайм-аут на стороне клиента.
Этот Django + WebKit = Сломанный канал ответ действительно отвечает на этот вопрос.
Почему это работает, изменив location.href
и не используя location.reload()
? Ну, я бы догадался, но это ТОЛЬКО предположение, что Firefox ведет себя немного по-другому, а перезагрузка будет по-разному.
Я думаю, что сообщение используется, потому что запрос уже отправляется, когда браузер нажимает на триггер и закрывает соединение.
Сервер dev является однопоточным, что также может быть причиной проблемы.
Обычно я делаю свою разработку на реальном (локальном) сервере (nginx + apache + mod_wsgi, ничего особенного), чтобы избежать глупых проблем, которые никогда не возникнут на производстве.
- Видите ли вы какие-либо проблемы, когда это «решение» может укусить меня в будущем?
Ну, это может не работать в браузере, который проверяет, изменился ли href
перед перезагрузкой. Или он может попасть в кеш вместо выполнения реального запроса (вы можете принудительно избежать кеша с помощью reload ()). И поведение может быть не согласованным во всех браузерах.
Но, опять же, вы уже столкнулись с особенностями браузера, так что я бы не стал особо волноваться об этом.
Кстати, вы могли бы просто сделать:
location.href = location.href
Я бы предпочел беспокоиться, что обработка займет 10 секунд! Это действительно не должно случиться.
edit Похоже, что сам браузер провоцирует длительное время обработки И ошибку сломанного канала. звучит как (плохие) параллельные запросы на однопоточном сервере django для меня. EndEdit
Тестируйте на реальном веб-сервере, оптимизируйте свой код; если этого недостаточно, запустите длинные задачи в фоновом режиме с помощью celery + rabbitmq; ни в коем случае не теряйте времени на проблему, которая на самом деле не является проблемой!
Вы, вероятно, сможете жить с location.reload()
и немного подправить ИЛИ, может быть, просто настоящую тестовую среду!