python -m pip uninstall pip setuptools
get-pip.py
из https://bootstrap.pypa.io/get-pip.py python get-pip.py
То, что вы можете сделать, это установить определенное место на вашем веб-сервере, которое классифицируется только как внутреннее, с бизнес-логикой в вашем приложении 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
, а Боб - ваш дядя - пользователь будет обслуживаться защищенный файл.
Я думаю, что самый мощный способ сделать это - записать пользовательское хранилище файлов
. Это не так сложно (но может быть излишним для ваших нужд). Затем вы можете привязать свое пользовательское хранилище к своей модели следующим образом:
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.
Приветствия!