Выполнение фонового задания в django
Я работаю над приложением pyaudio на django. Я хочу запускать поток в качестве фоновой функции, пока я не завершу поток намеренно с фронтенда.
ниже представлен мой views.py.
from django.shortcuts import render
from .models import Account
import pyaudio
import socket
import select
def start_stream(request):
var = request.POST['id']
streaming = False
if var == "start":
streaming = True
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 4096
audio = pyaudio.PyAudio()
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
if streaming:
serversocket.bind(('', 4443))
serversocket.listen(5)
def callback(in_data, frame_count, time_info, status):
for s in read_list[1:]:
s.send(in_data)
return (None, pyaudio.paContinue)
# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK, stream_callback=callback)
read_list = [serversocket]
print("streaming...")
while streaming:
readable, writable, errored = select.select(read_list, [], [])
for s in readable:
if s is serversocket:
(clientsocket, address) = serversocket.accept()
read_list.append(clientsocket)
print("Connection from", address)
else:
data = s.recv(1024)
if not data:
read_list.remove(s)
serversocket.close()
# stop Recording
stream.stop_stream()
stream.close()
audio.terminate()
print("finished streaming")
return None
def server(request):
return render(request, 'server.html')
Я создал шаблон с помощью функции сервера в моем views.py и использовал htmx из фронтенда для вызова конечной точки start_stream, которая затем вызывает функцию start_stream в моем views.py. Это мой 'server.html'
<div>
<h1>The Server page</h1>
<h3>Click on the button to start streaming</h3>
<form method="post">
{% csrf_token %}
<input type="hidden" value="start" name="id">
<button id="start" hx-post="/start_stream/">start</button>
</form>
<h3>Click on the button to stop streaming</h3>
<form method="post">
{% csrf_token %}
<input type="hidden" value="stop" name="id">
<button id="stop" hx-post="/start_stream/">stop</button>
</form>
</div>
Чтобы остановить поток, я должен завершить цикл while. Каждый раз, когда я нажимаю кнопку stop, он запускает функцию start_stream заново. Может ли кто-нибудь помочь, как завершить цикл в views.py django?