Nginx - как обслуживать защищенное видео на визуализированной странице в Django вместо принудительной загрузки? - PullRequest
0 голосов
/ 31 октября 2019

Мне нужен защищенный видеофайл на странице, созданной Django. Файл защищен, но он не отображает html-страницу с <video src="...">, как я ожидал, , как netflix. Вместо этого все, что я получаю, - это беспорядочный беспорядок типа это изображение.

Я знаю, что внутренний редирект обслуживает файл, поэтому он отображается так, но мне нужно его на визуализированной странице с другим html какnetflix делает .... Что я делаю не так ??

Файл конфигурации Nginx:

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>

1 Ответ

1 голос
/ 31 октября 2019

Вы комбинируете два запроса / ответа: визуализация страницы и отправка видео.

Вам необходимо отобразить шаблон, в котором вы даете видео URL-адрес, который вызывает представление Django. Затем это второе представление возвращает ответ с секретным URL-адресом в качестве acl-redirect. Итак:

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
...