Django - Загрузка конфиденциальных данных / изображений [дубликат]

  1. удалить текущий pip:
    python -m pip uninstall pip setuptools
    
  2. загрузить get-pip.py из https://bootstrap.pypa.io/get-pip.py
  3. выполнить скрипт get-pip:
    python get-pip.py
    
1
задан Sean W. 11 April 2013 в 15:10
поделиться

2 ответа

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

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

2
ответ дан Ian R.B. 21 August 2018 в 03:02
поделиться

Я думаю, что самый мощный способ сделать это - записать пользовательское хранилище файлов

. Это не так сложно (но может быть излишним для ваших нужд). Затем вы можете привязать свое пользовательское хранилище к своей модели следующим образом:

from django.db import models
from django.db.models.fields.files import FileField
from myapp.storage import MyCustomStorage

class MyModel(models.Model):
    path = FileField( ... , storage=MyCustomStorage(), blank=False)

Затем вы можете реализовать бизнес-логику в своем пользовательском классе хранения. В этом случае вы можете хранить ваши личные файлы в локальной файловой системе, базе данных или в удаленной системе, например, в Google AppEngine.

Приветствия!

1
ответ дан Nathan Osman 21 August 2018 в 03:02
поделиться
Другие вопросы по тегам:

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