2010-09-30 1 views
5

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

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

Спасибо

ответ

1

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

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

0

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

+0

Я надеялся на более общий ответ, так как сохранение количества отсчетов не будет единственной логикой :) – niklasfi

5

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

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

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

+0

это звучит неплохо, но я хотел бы сохранить приличный дизайн url и позволить пользователю скачать файл дважды из того же места – niklasfi

+0

Конечно, но эта модель все еще поддерживает это. Канонический URL-адрес файла - это URL-адрес, контролируемый Django, который является последовательным и достойным и т. Д., И единственным URL-адресом, который видит пользователь. Переадресация на символическую ссылку на Apache - это больше «детали сантехники», которые пользователь не замечает - браузер следит за перенаправлением прозрачно. – psj

1

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