Обслуживание статических файлов с логикой в ​​django (ведение счета загрузки) - PullRequest
5 голосов
/ 01 октября 2010

У меня есть сайт, который позволяет пользователю загружать определенные файлы.Тем не менее, я хочу сохранить количество загрузок для каждого файла, поэтому обычным способом будет размещение статических файлов на другом поддомене, а затем позволить Apache выполнять тяжелую работу, а не HttpResponseR.потому что тогда пользователь «видит» правильный URL-адрес загрузки и, следовательно, может загрузить файл без увеличения количества загрузок.Я мог бы просто создать представление, которое затем подает () файл, однако меня беспокоит этот "большой жирный отказ от ответственности" .Как бы вы / вы реализовали это?Я совершенно уверен, что я не единственный с этой проблемой.

О платформе: я использую apache и mod_wsgi.

Спасибо

Ответы [ 4 ]

5 голосов
/ 01 октября 2010

Мы внедрили систему, в которой нам нужно было контролировать доступ к загрузке (больших) статических файлов, естественно, не желая, чтобы Django обслуживал их сам.Мы придумали схему, согласно которой приложение Django, после проверки того, что пользователю разрешено загружать файл (или увеличить счетчик, в вашем случае), мы создали бы произвольную символическую ссылку на файл, к которой у Apache был доступ (будьте осторожны: убедитесь, что индексация каталогов отключена и т. д.), а затем перенаправьте пользователя на эту символьную ссылку, которая будет обслуживаться Apache.

У нас есть cronjob «cleanup», который очищает символическую ссылку через минуту после того, как он создан, поэтому, если они хотят загрузить его снова, они должны пройти через Django и пересчитать его снова.Теоретически они могли бы загрузить его более одного раза за это время, но возможно ли это?Вы можете очистить больше, чем каждую минуту: Apache просто нужна символическая ссылка, чтобы существовать в начале загрузки, а не на протяжении всего процесса.

Мне было бы интересно узнать, как другие решают эту проблему, так как ясогласен с ФП, что это распространенный сценарий.

1 голос
/ 26 апреля 2011

Самый простой способ сделать это - использовать заголовок Apache X-Sendfile. Просто установите в качестве значения заголовка путь к файлу, и Apache отправит вам файл. В этом сообщении есть еще некоторые детали: http://francoisgaudin.com/2011/03/13/serving-static-files-with-apache-while-controlling-access-with-django/.

1 голос
/ 01 октября 2010

ответ psj - определенно один жизнеспособный вариант. Другой вариант, который вам следует изучить, - это установить обратный прокси-сервер перед apache, например Perlbal , который поддерживает заголовки "X-REPROXY-URL".

Если у вас установлен обратный прокси-сервер, вместо отправки пользователю ответа о перенаправлении вы можете отправить ответ с заголовком «X-REPROXY-URL», в котором указан URL-адрес, по которому прокси-сервер может получить доступ, но пользователь не может Затем прокси-сервер прочитает файл из местоположения, которое вы отправили в заголовке, а затем передаст его вашему клиенту. Они будут делать это эффективным способом, и поскольку все, что нужно отправлять серверу приложений Django, - это ответ с набором заголовков, он может обработать другой запрос.

0 голосов
/ 01 октября 2010

Я сделал это с django-counter недавно.Позволяет отслеживать количество в админке.http://github.com/svetlyak40wt/django-counter/

...