Как вызвать функцию, если http-запрос - это POST в представлениях Django и передать новое переданное имя файла в вызов функции? - PullRequest
0 голосов
/ 20 июня 2019

Я работаю над веб-приложением, в котором пользователь загружает видео, и мы выполняем распознавание речи на нем, а затем переводим его текст на другой язык. Итак, если запрос POST, то мы вызываем ту функцию, которая выполняет эти функции, и если запрос GET, это не должно вызывать это, но в моем случае, по запросу POST, сначала выполняется функция, а затем отправляется запрос POST. И он выполняет функции для последнего видео в базе данных.

Это дает тот же результат, даже если я помещаю вызов функции в конце оператора условия запроса POST, и если я помещаю вызов функции из условия запроса POST, вызов функции при каждой перезагрузке страницы, которая не требуется, и я не знать другие способы, как решить эту проблему.

"""Django==2.0.2 views.py"""
def generatingsubtitle(request):

    latestvideo = Video.objects.last()
    videofile = latestvideo.videofile
    path = settings.MEDIA_ROOT + videofile.name
    filename = os.path.splitext(videofile.name)[0]

    srtpath=settings.STATIC_ROOT+filename

    if request.method == 'POST':
        #function call
        main(path, srtpath)

        form = forms.VideoForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('generatingsubtitle'),
    )
    else:
        form = VideoForm()
    return render(request, 'app/generate.html', {
        'form': form,
        'videofile': videofile,
        'filename':filename,
    },
    )

Я ожидаю, что сначала отправляется запрос POST, и мы берем путь к вновь отправленному файлу и передаем его вызову функции, но фактический результат - сначала вызов функции после отправки запроса функции POST.

Actual Result

Любая помощь будет высоко оценена.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Обработка должна выполняться только в том случае, если форма действительна и модель сохранена. Таким образом, вы выбираете последнюю модель еще до того, как форма будет сохранена, то есть вы действуете на предыдущей, а не на текущей модели.

Переместите функцию субтитров в поле проверки form.is_valid(), затем получите путь к сохраненному файлу из сохраненной модели и введите его в свою функцию обработки.

def generatingsubtitle(request):
    if request.method == 'POST':
        form = forms.VideoForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            # first save the model
            video_model = form.save()

            # get the path of the saved file from the model
            video_path = video_model.videofile.path

            # this may not be necessary anymore?
            [filename, ext] = os.path.splitext(video_model.videofile.name)
            srtpath = settings.STATIC_ROOT + filename

            # generate subtitles
            main(video_path, srtpath)

            return HttpResponseRedirect(reverse('generatingsubtitle'))
0 голосов
/ 20 июня 2019

Вы не должны запрашивать базу данных, если метод не «POST». Попробуйте это.

def generatingsubtitle(request):
    filename = os.path.splitext(videofile.name)[0]
    videofile = latestvideo.videofile

    if request.method == 'POST':
        form = forms.VideoForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            form.save()

            latestvideo = Video.objects.last()        
            path = settings.MEDIA_ROOT + videofile.name

            srtpath=settings.STATIC_ROOT+filename

            #function call
            main(path, srtpath)

            return HttpResponseRedirect(reverse('generatingsubtitle'))
    else:
        form = VideoForm() #edit
        context = {
                    'form': form,
                    'videofile': videofile,
                    'filename':filename,
                   }
        return render(request, 'app/generate.html', context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...