Выполнение фонового задания в 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?

Вернуться на верх