Как организовать хранение файлов пользователей в Django?

Поделитесь пожалуйста мыслями или опытом в реализации хранения файлов разных пользователей. Задача такая: необходимо чтобы пользователи в своих личных кабинетах могли загружать файлы через форму, и чтобы эти файлы были доступны только их создателям.
Примерно так: пользователь user1 загружает свои файлы в /storage/path/to/user1/date/time/file.name, а в личном кабинете у него появилась ссылочка на этот файл. Так же пользователь может удалить этот файл, и он должен удалиться и из хранилища тоже.
Вдруг кто-то реализовывал подобное, или есть готовые модули для django. Просто я не могу сообразить, каким запросом спросить это в гугле.
  • Вопрос задан
  • 2529 просмотров
Решения вопроса 2
@FireGM
Создать модель(назовем UserFiles) с полями file и ключ на модель пользователя.
В вьюхе брать request.user.userfiles_set.all() или фильтруйте как вам надо.
Для более сложных реализаций больше читайте документацию.
Ответ написан
Файлы будут доступны по прямым ссылкам. В этом видео поищите, как реализовано ограничение доступа к файлам с помощью nginx, который скорее всего и будет заниматься раздачей файлов в вашем проекте.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ilya_chch
в settings.py добавьте указание на расположение медиа
MEDIA_URL = '/media/' #например
MEDIA_ROOT = '/srv/files/media' #например


media_url - часть урла, по которому будут находиться картинки, media_root - место на сервере, где nginx будет их искать.

в модели:

class ModelClass(models.Model):
    <поле> = models.ImageField(upload_to=rename_image, blank=True, verbose_name='...')

def rename_image(instance, filename):
    image_name = md5(str(time.time()).encode()).hexdigest()
    image_type = filename.split('.')[-1]
    return 'imgs/{}.{}'.format(image_name, image_type)


rename_image в моем случае переименовывает загружаемую картинку в хэш. и в return можно добавить путь. в моем случае будет загружаться в media_root/imgs/<что-то>.jpg #например (при условии, что media_root определен, все всегда будет падать туда)

добавьте в путь подкаталог с именем user_{его id}. а вот насчет доступности только для этого пользователя - надо отдельно думать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы