允许用户播放mp3文件,但不要直接在网络上公开

时间:2010-07-06 18:27:21

标签: django media-player mediaelement

我想将一些mp3存储在一个没有公开的文件夹中,不能直接通过网络访问,只有在用户登录后才允许用户通过浏览器收听/下载歌曲。

我该怎么做?

我使用django进行网络开发,但如果我知道它的工作原理就足够了。

3 个答案:

答案 0 :(得分:5)

首先需要设置身份验证。 django教程深入探讨了这一点。

你没有直接链接mp3,你链接到检查auth的django脚本,然后读取mp3并用mp3内容类型标题将其提供给客户端。

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

答案 1 :(得分:4)

答案 2 :(得分:4)

  • 公共访问之外的文件(不在 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

应该完成这项工作,但请记住 - 曾经访问过的内容,你无法控制它从现在开始的位置。并且每个文件下载都需要通过应用程序读取文件(它没有静态地给出),这将影响应用程序的性能。