Невозможно отобразить другую веб-страницу во время выполнения цикла Django

Я хотел бы достичь такого потока:

  1. User's face is detected by webcam in homepage
  2. The app takes the attendance of the user, display a webpage with the attendance details
  3. The attendance details page will redirect back to the homepage after few seconds with the webcam still running

На данный момент мое приложение может принимать данные о посещаемости пользователя, но не переходит на страницу с деталями посещаемости, даже если я использовал return render(). Оно остается на домашней странице с работающей веб-камерой. Есть ли способ решить эту проблему или я делаю что-то не так? Я пробовал изменить детали запроса вручную следующим образом, но это не помогает.

request.resolver_match = resolve('/takeAttendance/')
        request.path='/takeAttendance/'
        request.path_info='/takeAttendance/'

Задействованный код выглядит следующим образом:

views.py:

from django.shortcuts import render, redirect
from django.contrib import messages
from django.http import HttpResponse , StreamingHttpResponse
from datetime import datetime, date
import cv2
import face_recognition
import numpy as np
import threading

foundFace = False
vs = cv2.videoCapture(0)
lock = threading.Lock()
frame = None

def videoFeed(request):
        return StreamingHttpResponse(getFace(request),content_type="multipart/x-mixed-replace;boundary=frame")

def getFace(request):
    global vs,outputFrame,lock,foundFace
    known_face_names,known_face_encodings = getFiles() # get the image files from my project directory
    face_location = []
    face_encoding = []
    while foundFace==False:
        check,frame = vs.read()
        small_frame = cv2.resize(frame,(0,0),fx=0.5,fy=0.5)
        face_roi = small_frame[:,:,::-1]
        face_location = face_recognition.face_locations(face_roi)
        face_encoding = face_recognition.face_encodings(face_roi,face_location)
        face_names = []
        names=[]
        for encoding in face_encoding:
            matches = face_recognition.compare_faces(known_face_encodings,np.array(encoding),tolerance=0.6)
            distances = face_recognition.face_distance(known_face_encodings,encoding)
            matches = face_recognition.compare_faces(known_face_encodings,np.array(encoding),tolerance=0.6)
            distances = face_recognition.face_distance(known_face_encodings,encoding)
            best_match_index = np.argmin(distances) 

            if matches[best_match_index]:
                name = known_face_names[best_match_index]
                face_names.append(name)
                if name not in names:
                    names.append(name)
        #process the frame (add text and rectangle, add name of identified user to names)
        with lock:
            (flag,encodedImg) = cv2.imencode(".jpg",frame)
            
        if len(names)!=0:
            foundFace=True
        if foundFace==True:
            takeAttendance(request,names)
            
        yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + 
            bytearray(encodedImg) + b'\r\n')

def takeAttendance(request,names):
    context={}
    if request.method=='GET':
        if user_id in names:
            attendance = Attendance(user_ID = str(user_id),
                                            date_in = date.today(),
                                            time_in = datetime.now())
            attendance.save()
            context={'attendance':attendance}
            messages.success(request,'Check in successful')
            return render(request,'Attendance/attendance.html',context)
        else:
            messages.error(request,'Check in failed')
            return redirect('home')
    else:
        return redirect('home')

urls.py:

from django.urls import path
from . import views
urlpatterns=[
    path('home/',views.home,name='home'),
    path('takeAttendance/',views.takeAttendance,name='takeAttendance'),
    path('videoFeed/',views.videoFeed,name='videoFeed'),

]

Использую Django 3.1 и совсем новичок в этом, спасибо!

О... почему я этого не заметил...

Проблема заключается в следующем:

...
        if foundFace==True:
            takeAttendance(request,names)
...

Да, вы выполняете функцию, которая возвращает вывод рендеринга внутри getFace. И это все, getFace вообще не использует возвращаемое значение.

Правильный код должен выглядеть так:

...
        if foundFace==True:
            returned_render = takeAttendance(request,names)
            return returned_render
...

или просто:

...
        if foundFace==True:
            return takeAttendance(request,names)
            # or maybe you should use yield instead of return?
            # I don't know. Check both
            yield takeAttendance(request,names)
...
Вернуться на верх