首页 > 解决方案 > 如果http请求在Django视图中是POST,如何调用函数并将新提交的文件名传递给函数调用?

问题描述

我正在开发网络应用程序,其中用户上传视频,我们对其执行语音识别,然后将其文本翻译成另一种语言。所以,如果请求是 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 请求后首先调用函数。

实际结果

任何帮助将不胜感激。

标签: pythondjangohttprequest

解决方案


您应该仅在表单有效且模型已保存时进行处理。你拥有它的方式,你在表单被保存之前获取最后一个模型,这意味着你正在对以前的模型进行操作,而不是当前的模型。

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

推荐阅读