如果http请求在Django视图中为POST并将新提交的文件名传递给函数调用,如何调用函数?

时间:2019-06-20 04:30:30

标签: python django httprequest

我正在开发一个Web应用程序,在该应用程序中,用户上传视频,然后我们对其进行语音识别,然后将其文本翻译为另一种语言。因此,如果请求是POST,则我们调用该函数来执行这些功能,如果request是GET,它不应调用它,但就我而言,在POST请求上,先执行函数,然后提交POST请求。它对数据库中的最后一个视频执行功能。

即使我将函数调用放在POST请求条件语句的末尾,并且如果我将函数调用放在POST请求条件的末尾,它也会得到相同的结果,该函数在每次不需要的页面重载时都调用,并且我也不需要知道其他解决方法。

Array#get

我希望首先提交POST请求,然后我们将新提交的文件的路径传递给函数调用,但实际输出是在执行函数POST请求提交后首先调用该函数。

Array

我们将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:1)

仅当表单有效且模型已保存时,才应进行处理。这样一来,您就可以在保存表单之前获取最后一个模型,这意味着您是在作用于先前的模型,而不是当前的模型。

将您的字幕功能移至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'))

答案 1 :(得分:0)

除非方法为“ 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)