4

一部のmp3を公開されていないフォルダーに保存し、Webから直接アクセスできず、ユーザーがログインしている場合にのみブラウザーで曲を聴いたりダウンロードしたりできるようにしたい。

どうやってやるの?

私はDjangoを使用してWeb開発を行っていますが、それがどのように機能するかを知っていれば十分です。

4

3 に答える 3

5

最初に認証を設定する必要があります。django のチュートリアルでは、これを徹底的に調べています。

mp3を直接リンクするのではなく、認証をチェックするdjangoスクリプトにリンクし、mp3を読み取り、mp3コンテンツタイプヘッダーでクライアントに提供します。

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

于 2010-07-06T18:32:03.167 に答える
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

十分な仕事をする必要がありますが、覚えておいてください - 一度アクセスされたものは、それがどこに行くのかを制御することはできません. また、ファイルをダウンロードするたびに、アプリを介してファイルを読み取る必要があり (静的に与えられるわけではありません)、これはアプリのパフォーマンスに影響します。

于 2010-07-06T19:19:51.830 に答える
4

ジャンゴを使っているとします。次に、次のようなことを試すことができます。

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で大きなファイルを読むための怠惰な方法?

于 2010-07-06T18:53:20.077 に答える