Nginx-如何在Django的渲染页面上提供受保护的视频,而不是强制下载



我需要Django渲染的页面上有一个受保护的视频文件。该文件是受保护的,但它并不像我所期望的那样为带有<video src="...">的html渲染页面提供服务,就像netflix一样相反,我得到的只是像这张图片一样杂乱无章。

我知道内部重定向正在为文件提供服务,因此它显示为那样,但我需要它与其他html一起出现在渲染页面上,就像netflix所做的。。。。我做错了什么??

Nginx conf文件:

location /secret_videos/ {
internal;
alias /home/username/path/to/secret/videos/;
}

Url:

path('protected_video/', views.protected_video, name='protected_video'),

视图:

def protected_video(request):
....
if request.method =='POST':
if some_var == 'the_correct_value':
protected_uri = '/secret_videos/secret-vid-1.mp4'
response = render(request, 'template.html', {'some_var ': True, 'protected_uri': protected_uri})
response['X-Accel-Redirect'] = protected_uri
return response
return render(request, 'template.html', {})

模板,但它不渲染html,只渲染上面的图像:

<video width="75%" height="auto" controls>
<source src="{{ protected_uri }}" type="video/mp4" />
Your browser doesn't support the mp4 video format.
</video>

您正在组合两个请求/响应:呈现页面和发送视频。

您需要呈现模板,在该模板中,您为视频提供了一个调用Django视图的URL。然后,第二个视图返回一个带有机密URL的响应作为accel重定向。因此:

path('protected_video/', views.protected_video, name='protected_video'),
path('video_url/<slug: video_slug>/', views.redirect_to_video, name='redirect_to_video'),
...
def protected_video(request):
....
if request.method =='POST':
if some_var == 'the_correct_value':
protected_uri = reverse('redirect_to_video' , kwargs={'video_slug': 'some_slug'})
return render(request, 'template.html', {'some_var ': True, 'protected_uri': protected_uri})
def redirect_to_video(request, slug):
... some logic to get the secret URL from the slug ...
response = HttpResponse()
response['X-Accel-Redirect'] = secret_url
return response

最新更新