0

プライベートファイルアップロードサイトを構築しています。アリスはファイルをアップロードし、ボブはそれをダウンロードします。

アリスとボブ以外の人はアクセスできないようにする必要があります。私は最初にファイルに複雑な名前(http://domain/download/md5sum.zip)を付けることを考えていましたが、期限切れのリンクが必要です。だからのようなものhttp://domain/download/tempkey/aaa123/file.zip。これにより、ファイルのダウンロードとロギングをより細かく制御できるようになります。

私はこれを見つけました:https ://stackoverflow.com/a/2900646 。それは次のことを示唆しています:

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        # The URL the client requested
        print self.path

        # analyze self.path, map the local file location...

        # open the file, load the data
        with open('test.py') as f: data = f.read()

        # send the headers
        self.send_response(200)
        self.send_header('Content-type', 'application/octet-stream') # you may change the content type
        self.end_headers()
        # If the file is not found, send error code 404 instead of 200 and display a message accordingly, as you wish.

        # wfile is a file-like object. writing data to it will send it to the client
        self.wfile.write(data)

しかし、これをDjangoで機能させるにはどうすればよいですか?ビュー関数はHTTPResponseオブジェクトを返す必要がありますが、これは返しません。

4

1 に答える 1

4

Django を使用して大きなファイルをダウンロードすることは、あまりお勧めできません。通常、NginX などのフロントエンド マルチプレクサがあり、Django を使用してファイルを検証するだけです。

次に、ダウンロードが検証された場合は、マルチプレクサにシグナルを発行します。NginX の場合、特別なヘッダー (「X-Accel-Redirect」) を設定して、ローカル ファイルの実際の場所を指すことができます。Django は数バイトしか提供せず、面倒な作業はすべて NginX が担当します。同時に元の URL は Django の URL になるため、セキュリティをバイパスすることはできません。

参照: http://wiki.nginx.org/X-accel

静的ファイル (認証で拡張可能) を提供する方法に関するメモは、こちらにあります。

https://docs.djangoproject.com/en/dev/howto/static-files/

しかし、このページにあるように、これは「迅速で汚いヘルパー ビュー」であり、運用サイトやトラフィックの多いサイト向けではありません。それは Django ができるとしても、そのように設計されたものではありません。

于 2012-09-13T14:32:04.873 に答える