Как остановить StreamingHttpResponse в django, когда клиент отключается?Python

Программы на Python
Anonymous
Как остановить StreamingHttpResponse в django, когда клиент отключается?

Сообщение Anonymous »

Мой сервер Django передает видео в виде потока JPEG, по одному кадру за раз.

Это выглядит так:

Код: Выделить всё

class VideoCamera():
def __init__(self):
# code

def get_frame(self):
# code
return frame

def gen(camera):
while True:
yield camera.get_frame()

def view_cam(request):
return StreamingHttpResponse(gen(VideoCamera()), content_type="multipart/x-mixed-replace;boundary=frame")
Это прямая трансляция с камеры, поэтому поток не имеет конца. Мне нужно, чтобы он прерывался при отключении клиента, но пока я не могу понять, как определить, что клиент отключился.

Я что-то упустил?< /p>

Изменить:

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

Код: Выделить всё

def gen():
for i in range(1000):
time.sleep(1)
print(i)
yield i

def view_cam(request):
return StreamingHttpResponse(gen(), content_type="multipart/x-mixed-replace;boundary=frame")
и подключился к моему представлению с помощью curl -N http://localhost/my_app/view_cam/. Он передает числа потоком, и когда я останавливаю завиток с помощью Ctrl+C, генератор просто продолжает работать бесконечно, не замечая, что клиент исчез. Если я запущу и остановлю Curl еще несколько раз, у меня будет запущено несколько экземпляров моей функции gen(), что и происходит с камерой.

Редактировать 2:

В этом проекте используются каналы Django. Я только что заметил, что если я отключу каналы, закомментировав их в файле settings.py, приведенный выше пример будет работать отлично. Я не думал, что каналы связаны с проблемой, но, видимо, так оно и есть.

Сервер разработки каналов действительно обнаруживает отключение через 10 секунд (не сразу). например сервер django по умолчанию) и покажите это:


Вызов экземпляра приложения () выполняется в
/home/pi/paperless_clipboard /venv3/lib/python3.5/site-packages/channels/http.py:213>
wait_for=._call_check_cancel() в
/usr/lib/python3.5/asyncio/futures.py :452, Task._wakeup()]>> для
соединение слишком долго закрывалось и было прервано.


но, несмотря на сообщение о том, что что-то было уничтожено, gen() продолжает работать, выводя числа на терминал.

Подробнее здесь: https://stackoverflow.com/questions/547 ... isconnects

Вернуться в «Python»