Вопрос по permissions, file-permissions, file-upload, django – Django загрузка частного файла

1

Я бы хотел, чтобы пользователи с правами администратора могли прикреплять произвольные личные файлы, связанные с моими моделями, например, Share Point. Поскольку Django в основном используется в качестве платформы для публикации, все примеры, которые яМы обнаружили, что загружаем файлы в статический каталог, где они общедоступны. Как я могу разрешить администратору загружать файлы, которые имеют те же права доступа, что и модель, с которой они связаны?

Ваш Ответ

2   ответа
1

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

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

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.

Ура!

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}, в котором вы выполняете необходимую бизнес-логику для управления доступом к нему (может потребоваться сделать параметры пути несколько более подробными, чтобы можно было захватить метку приложения, модель и объект Идентификатор, к которому прикреплен файл для контроля доступа, например / media / {app_label} / {model} / {object_id} / {filename})

Вы тогда просто делаете

response = HttpResponse()
response['X-Accel-Redirect'] = "/protected" + filepath
return response

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

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