Разрешить пользователям воспроизводить mp3-файлы, но не выставлять их непосредственно в Интернете - PullRequest
4 голосов
/ 06 июля 2010

Я хочу хранить некоторые mp3-файлы в папке, которая не является общедоступной, к ней нельзя получить прямой доступ через Интернет и разрешить пользователям прослушивать / загружать песни с помощью браузера, только если они вошли в систему.

Как я могу это сделать?

Я занимаюсь веб-разработкой с помощью django, но если я знаю, как это работает, то достаточно.

Ответы [ 3 ]

5 голосов
/ 06 июля 2010

Сначала необходимо настроить аутентификацию.В руководствах по django это подробно рассматривается.

Вы не 'напрямую связываете mp3-файлы, вы ссылаетесь на сценарий django, который проверяет аутентификацию, затем читает mp3 и передает его клиенту с заголовком типа содержимого mp3..

http://yourserver.com/listen?file=Fat+Boys+Greatest+Hits

4 голосов
/ 06 июля 2010
  • Файл вне публичного доступа (не в Папки MEDIA_URL)
  • Проверьте, вошел ли пользователь в систему
  • Служить файлы только через представление, с уникальные ссылки для каждого пользователя

псевдокод:

class Mp3(models.Model):
    file = models.FileField(upload_to=path_outside_of_public_access)
    hash = models.CharField(unique=True)


def generate_link_hash(request, file):
    return hashlib.md5("%s_%i_%s_%s" % (request.session.session_key, file.id, str(file.date_added), file.hash)) # or however u like


def files_list(request)
    """ view to show files list """
    for file in files:
        file.link_hash = generate_link_hash(request, file)


@login_required
def download_file(request, file_hash, link_hash):
    """ view to download file """
    file = Mp3.objects.get(hash=file_hash)
    if link_hash == generate_link_hash(request, file):
        file = open(file.file)
        return HttpResponse(file.read(), mimetype="audio/mpeg")
    else:
        raise Http404

Должен делать работу достаточно, но помните - к тому, к чему когда-то обращались, у вас нет контроля, куда он идет с этого момента. И что каждая загрузка файла требует чтения файла через приложение (оно не указано статически), что повлияет на производительность вашего приложения.

4 голосов
/ 06 июля 2010

Я полагаю, вы используете Django.Тогда вы можете попробовать что-то вроде этого:

from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse


@login_required
def listen(request, file_name):
    # note that MP3_STORAGE should not be in MEDIA_ROOT
    file = open("%smp3/%s" % (settings.MP3_STORAGE, file_name))
    response = HttpResponse(file.read(), mimetype="audio/mpeg")
    return response

Обратите внимание, что вы получите резкое снижение скорости.Использование генератора для чтения файла в блоках может помочь сэкономить память.

Ленивый метод чтения большого файла в Python?

...