创建文件后将文件发送给用户

时间:2018-12-03 15:28:40

标签: python flask moviepy

当用户单击html页面上的按钮时,我正在使用moviepy创建新电影。我想将新电影退还给用户。 但是电影创作需要时间。仅在创建文件后才能对send_file做什么?

@app.route('/createVideo', methods=['POST'])
def createVideo():
    content = request.get_json()
    videoPromo = content['videoPromo']
    videoPerso = content['videoPerso'] 
    subclip1 = VideoFileClip(videoPromo)
    subclip2 = VideoFileClip(content['videoPerso'])
    subclip = concatenate_videoclips([subclip1, subclip2], method="compose")
    subclip.write_videofile("out.mp4",progress_bar = False)
    vid_path = os.path.join(MEDIA_PATH, 'out.mp4')
    return send_file(vid_path)

我的HTML代码:

    <video id="videoPromo" controls class="video-js vjs-default-skin vjs-big-play-centered">
      <source src="http://localhost:5000/var/myvideo.mp4" type="video/mp4">
    </video>

    <video id="videoPerso" controls class="video-js vjs-default-skin vjs-big-play-centered">
      <source src="http://localhost:5000/var/oceans.mp4#t=0.7" type="video/mp4">
    </video>


    <div class="btn-group" role="group" aria-label="...">
      <button class="create-video btn btn-default" type="button">Create Video</button>
    </div>
<script>

$(".create-video").click(function(){

  $.ajax({
    type: "POST",
    url: "/createVideo",
    data: JSON.stringify({  videoPerso: $("#videoPerso source").attr("src") , videoPromo: $("#videoPromo source").attr("src")}),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){                console.log(data);
},
    failure: function(errMsg) {
        alert(errMsg);
    }
});
  });
</script>

1 个答案:

答案 0 :(得分:0)

如果您的任务花费了一段时间,并且您不想让用户等待(并阻止python解释器!),则可以返回一个临时结果,说“处理中……”,然后执行使用某种任务队列(例如celery)的后台任务。

在您的页面上,您可以定期轮询某个终结点,以查看后台任务是否已完成视频的创建,并在获得该URL后取回该URL。取回网址后,您可以向用户显示视频。