То, что вы можете сделать, это установить определенное место на вашем веб-сервере, которое классифицируется только как внутреннее, с бизнес-логикой в вашем приложении Django, которое отправит перенаправление с определенным заголовком, который позволит вашему веб-серверу обслуживать файл статически .
Я уже делал это с помощью Nginx, используя X-Accel-Redirect, поэтому я собираюсь использовать его для моего примера, но я считаю, что в Apache2 и других веб-серверах есть эквивалентная функциональность (X-Sendfile, Я думаю?).
В вашей конфигурации Nginx настройте местоположение, которое обслуживает каталог, в котором вы загружаете файлы, защищенные доступом:
location /protected/ {
internal;
alias /var/www-priv/;
}
Файлы в этом каталоге будут не быть доступным извне по URL-адресу / protected / {filepath}, но будет, если вы вернете ответ от своего приложения Django с заголовком X-Accel-Redirect = /protected/{filepath}.
Создайте представление с URL-адресом, например / media / {filepath}, в котором вы выполняете необходимую бизнес-логику для контроля доступа к ней (вы можете захотеть сделать путь params немного более подробно, так что вы можете захватить метку приложения, модель и идентификатор объекта, к которому прикреплен файл для целей контроля доступа, например. / media / {app_label} / {model} / {object_id} / {filename})
Затем вы просто выполняете
response = HttpResponse()
response['X-Accel-Redirect'] = "/protected" + filepath
return response
, а Боб - ваш дядя - пользователь будет обслуживаться защищенный файл.
Флаги re
, такие как re.I
, представляются целочисленными значениями. Но они интерпретируются как двоичные битовые маски. Итак, вот что ваши маски на самом деле равны:
re.S | re.X = 80
re.S + re.X = 80
re.S & re.X = 0
Вот то, что значение 80
в двоичном виде:
1010000
А вот значения для [116 ] (64) и re.X
(16) в двоичном виде:
re.S = 1000000
re.X = 0010000
1010000 <--- 80 in decimal
Должно быть ясно, что re.S | re.X
и re.S + re.X
перекрывают биты обоих флагов, в то время как re.S & re.X
не. В этом случае целочисленное сложение +
и побитовое ИЛИ |
дают одинаковый результат.