Когда я бросить Django manage.py runserver
с Ctrl + C, не работает нити HTTP закончить запрос правильно или они прерваны в середине?`manage.py runserver` и Ctrl + C (Джанго)
ответ
TL; DR работает HTTP запросы будут остановлены, когда Ctrl + C ударил на Джанго Dev сервере
Я думал, что ваш вопрос действительно интересен и исследован:
Я сделал который занимает 10 секунд, и после этого отправляет ответ. Чтобы проверить ваше поведение, я остановил сервер разработки manage.py runserver
, используя Ctrl + C и проверял результаты.
Моя база тест:
class TestView (generic.View):
def get (self, request):
import time
time.sleep(10)
response = HttpResponse('Done.')
return response
- Нормальный Execute (10s во время выполнения): Отображает Сообщ
Done.
- прервал выполнение (Ctrl + C пока запрос работает): Ошибка браузера , хозяин не может быть достигнут
до сих пор каждый г, как ожидалось. Но я играл немного, потому что Ctrl + C в питоне не полная остановка, но на самом деле обрабатывается довольно удобно: Как только Ctrl + C будет хитом, KeyboardInterrupt
аки Исключение воскресе (эквивалент этого):
raise KeyboardInterrupt()
так в вашей программе на основе командной строки вы можете поместить следующее:
try:
some_action_that_takes_a_while()
except KeyboardInterrupt:
print('The user stopped the programm.')
портирована Джанго новый вид выглядит так:
def get (self, request):
import time
slept_for = 0
try:
for i in range(100):
slept_for += 0.1
time.sleep(0.1)
except KeyboardInterrupt:
pass
response = HttpResponse('Slept for: ' + str(slept_for) + 's')
return response
- Normal выполнить (10s выполнения): Отображает Сообщ
Slept for: 10s
- прервал выполнение (Ctrl + C в то время как запрос) Ошибка браузера, хост не может быть достигнут
поэтому никаких изменений в поведении здесь.из интереса я изменил одну строку, но результат не изменился; я использовал
slept_for = 1000*1000
вместо
time.sleep(0.1)
так, чтобы, наконец, ответить на ваш вопрос: на Ctrl + C сервер DEV немедленно отключается и работает HTTP-requets является не законченного.
По умолчанию «manage.py runningerver» использует потоки демона для ответа на запросы, а это означает, что полный процесс завершается, как только заканчивается основной поток, и он не будет ждать окончания нитей демона. Поскольку 'KeyboardInterrupt' запускается в основном потоке, который не обслуживает никаких ответов, вы не можете его захватить в своем представлении, и процесс со всеми потоками демонов немедленно прекращается. Вот почему ваш второй пример до сих пор не завершает ответ. – knbk
- 1. Джанго manage.py runserver ошибка
- 2. Джанго питон manage.py runserver
- 3. Джанго и питон manage.py runserver ошибка выполнения
- 4. manage.py runserver ImportError
- 5. питон ./store/manage.py runserver
- 6. питон manage.py runserver не работает
- 7. manage.py runserver в virtualenv используя неправильно Джанго версию
- 8. Django manage.py runserver не работает
- 9. manage.py runserver не прекращает
- 10. Синтаксическая ошибка Джанго (1.10.1) при выполнении PY -3.5 manage.py runserver
- 11. Джанго runserver цвет выход
- 12. Джанго ошибка runserver
- 13. «питон manage.py runserver» = не может выполнить двоичный файл ошибки (Джанго)
- 14. python3 manage.py runserver для Django
- 15. Джанго runserver из сценария Python
- 16. Джанго: Plugable приложение на runserver
- 17. Джанго ошибка runserver (psycopg2)
- 18. Джанго Учебник: Runserver не работает
- 19. Джанго runserver внутри IPDB/IPython
- 20. Джанго ошибка runserver (SQLite2 & sqlite3)
- 21. Джанго Runserver Никогда Запускает
- 22. Джанго-админ ошибка runserver
- 23. питон ошибка manage.py runserver django.core.exceptions.ImproperlyConfigured: T
- 24. IndentationError при запуске manage.py runserver Django
- 25. трассировки стека из manage.py runserver не появляются <code>runserver</code> команды
- 26. Джанго: Скрыть запрос от runserver стандартного вывода
- 27. Джанго рестарт runserver стиль изнутри Джанго приложение
- 28. Джанго runserver с WebPack и проекта reactjs структуры
- 29. Джанго тест manage.py
- 30. Джанго питон manage.py SyncDB
Я считаю, что Ctrl + C убивает процесс и все подпроцессы, связанные с основным потоком. Поэтому они будут прерваны посередине. Вы можете, вероятно, использовать ps -eLf (linux, unix), чтобы перечислить все потоки как средство двойного подтверждения. – reticentroot