我正在创建一个功能,让用户提交他们的产品在电子商务项目的视频。用户通过带有filefield的django表单上传视频,然后我使用django拍摄视频并将其发送到Vimeo的API进行上传。这是目前工作,但我注意到它真的很慢。当用户在表单上按下submit (提交)时,视频长度为1分钟(120mb),他们等待超过1分钟才能成功提交表单。
什么是最好的解决方案,让上传完成,但仍然让用户继续浏览我们的网站,而它在后台运行?
传递给此函数的视频是表单中的TemporaryUploadedFile。
def video_upload(video, product_pk):
#Initial sending, get an upload link
url = 'https://api.vimeo.com/me/videos'
headers = {
'Authorization': 'bearer %s' % settings.VIMEO_TOKEN, 'Content-Type' : 'application/json', 'Accept' : 'application/vnd.vimeo.*+json;version=3.4'}
data = {'upload' :{ 'approach' : 'tus', 'size' : video.size}, 'name' : str(product_pk)}
r = requests.post(url, headers=headers, data=json.dumps(data))
if r.status_code == 200:
uri = r.json()['uri'] # link to final video
upload_link = r.json()['upload']['upload_link']
approach = r.json()['upload']['approach']#should be tus
if approach == 'tus':
#first attempt to upload video
headers = {'Tus-Resumable': '1.0.0', 'Upload-Offset' : '0', 'Content-Type' : 'application/offset+octet-stream', 'Accept' : 'application/vnd.vimeo.*+json;version=3.4'}
video_rb = video.open('rb')
r = requests.patch(upload_link, video_rb, headers=headers)
#Second attempt to upload video
#Verify upload is complete
headers = {'Tus-Resumable': '1.0.0', 'Accept' : 'application/vnd.vimeo.*+json;version=3.4'}
r = requests.head(upload_link, headers=headers)
return uri
请注意,该功能尚未完成,因为我需要添加更多的视频上传等第二次尝试的逻辑。
任何关于更有效和可伸缩的方法的建议都将非常受欢迎。
发布于 2021-03-08 03:16:40
我用Celery和Redis设置了一个异步函数,做了类似的事情。这样我就可以让用户在后台上传内容时立即继续。上传内容后,我将URL保存到数据库中的某个位置,并将上传完成(或失败)的信息推送给用户。希望这能为任何观众提供解决这个问题的潜在方法。
https://stackoverflow.com/questions/61902218
复制相似问题