class task_check(AuthententicatedOrReadOnlyAPIView):
content_negotiation_class = IgnoreClientContentNegotiation
def get(self, request):
timeout = int(request.query_params.get('timeout', 300))
task_id = request.session.get('pending_task_id')
if not task_id:
return HttpResponse("No pending task", status=404)
def event_stream():
start_time = time.time()
while True:
if time.time() - start_time > timeout:
del request.session['pending_task_id']
request.session.modified = True
yield f"data: {json.dumps({'status': 'TIMEOUT'})}nn"
break
event_task_id = request.session.get('pending_task_id')
if not event_task_id:
yield f"data: {json.dumps({'status': 'TIMEOUT'})}nn"
task = AsyncResult(event_task_id)
if task.ready():
del request.session['pending_task_id']
request.session.modified = True
yield f"data: {json.dumps({'status': 'DONE'})}nn"
break
else:
yield f"data: {json.dumps({'status': 'PENDING'})}nn"
time.sleep(5) # Check every 5 seconds
response = StreamingHttpResponse(event_stream(), content_type='text/event-stream')
response['Cache-Control'] = 'no-cache'
response['X-Accel-Buffering'] = 'no'
return response
Now this code inside event_stream does not delete the pending_task_id for some reason, this lines execute as per the logic without error or warning but in next call to get of task_check , the session field pending_task id is as it is