Что такое решение Django / Python для предоставления пользователям разовых URL-адресов для загрузки файлов? - PullRequest
5 голосов
/ 21 сентября 2009

Я ищу способ продать кому-то карту на мероприятии, которое будет иметь уникальный код, который он сможет использовать позже, чтобы загрузить файл (mp3, pdf и т. Д.) Только один раз и замаскируйте истинное местоположение файла, чтобы опытный человек, загружающий файл, не мог загрузить файл более одного раза. Было бы неплохо разместить файл на Amazon S3, чтобы сэкономить на пропускной способности, где наш сервер расположен совместно.

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

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

Я предполагаю, что смогу что-то настроить, используя django.views.static.serve, который действует как своего рода прокси между фактическим файлом и пользователем, загружающим файл. Единственный недостаток этого метода, я думаю, заключается в том, что мне нужно будет использовать настоящий веб-сервер, и я не смогу сохранить файл на Amazon S3.

Любые предложения или мысли с благодарностью.

Ответы [ 2 ]

3 голосов
/ 21 сентября 2009

Аккуратная идея. Тем не менее, я бы предостерег от метода однократной загрузки, поскольку нет гарантии, что их первая попытка загрузки будет успешной. Возможно, вместо этого используйте метод истечения времени?

Но, конечно, это можно сделать с Джанго. Вот схема основного подхода:

  • Настройка URL-адреса django для обслуживания этих файлов
  • Используйте параметр GET, который является уникальной строкой, чтобы определить, какой файл получить.
  • Сохраните таблицу базы данных, которая имеет FileField для загружаемого файла. Эта таблица отображает уникальные строки в расположение файла в файловой системе.
  • Чтобы файл был загружен, установите заголовки ответов в виде:

(path - местоположение файла для обслуживания)

with open(path, 'rb') as f:
    response = HttpResponse(f.read())
response['Content-Type'] = 'application/octet-stream';
response['Content-Disposition'] = 'attachment; filename="%s"' % 'insert_filename_here'
return response

Поскольку мы используем эту страницу Django для обслуживания файла, пользователь не может узнать исходное местоположение файла.

2 голосов
/ 21 сентября 2009

Вы можете просто использовать что-то простое, например mod_xsendfile . Эта функциональность также доступна в других популярных веб-серверах, таких как lighttpd или nginx .

Это работает следующим образом: когда приложение включено (например, тривиальный скрипт PHP), оно может отправлять специальный заголовок ответа, заставляя веб-сервер обслуживать статический файл.

Если вы хотите, чтобы он работал с S3, вам нужно будет обрабатывать каждый запрос таким образом, то есть трафик будет проходить через ваш сайт, оттуда до AWS, обратно на ваш сайт и обратно к клиенту. Поддерживает ли S3 символические ссылки / псевдонимы? Если это так, вы можете просто перенаправить действительного пользователя на один из символических URL-адресов и удалить эту символическую ссылку через пару часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...