какая разница между операторами при использовании нескольких re.FLAG

То, что вы можете сделать, это установить определенное место на вашем веб-сервере, которое классифицируется только как внутреннее, с бизнес-логикой в ​​вашем приложении 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

, а Боб - ваш дядя - пользователь будет обслуживаться защищенный файл.

1
задан Yannick 7 March 2019 в 08:22
поделиться

1 ответ

Флаги 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 не. В этом случае целочисленное сложение + и побитовое ИЛИ | дают одинаковый результат.

0
ответ дан Tim Biegeleisen 7 March 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: